リモートサーバーでのDELETE / INSERTのパフォーマンスを向上させる

StackOverflow https://stackoverflow.com/questions/1438004

  •  08-07-2019
  •  | 
  •  

質問

このシナリオでは、2つのデータベースサーバーがあります。1つはLAN(サーバーA)にあり、もう1つはリモートロケーション(サーバーB)にあります。

プロジェクトのデータをサーバーAからサーバーBに転送します。これを行うには、まず特定のProjectIDのサーバーBにある既存のデータを削除し、その後サーバーAからサーバーBにデータを挿入します。データはサーバーAで準備されます。

実際に転送されるデータの量は約2.5MBです。 20MBit接続では、これはフラッシュで実行する必要があります。ただし、SQLでは30〜40秒かかります。実際、同じ量のデータを取得してFTPで転送する場合、4秒かかります。 :)

SET NO COUNTがオンになっています。これにより、リモートクエリが高速化される可能性があることを読みました。
この遅い転送の原因は何ですか?

編集:
SQLが本当に原因であるはずです。次のように分類されます:
-あらゆる種類のデータベースからデータを選択し、サーバーAのDBに挿入します
-ProjectB = x
のサーバーB DBから削除 -サーバーB DBに挿入-ProjectID = x

のサーバーA DBから*を選択

最後の2つのステップには約40秒かかります。ご覧のとおり、古いレコードを削除して新しいレコードを挿入するだけです。結合も難しいT-SQL構文もありません。

役に立ちましたか?

解決

削除が発生するデータベースBの設計と構造を徹底的に確認します。インデックスが適切に設計および最適化されていることを確認し、外部キー関係と、削除が発生しているテーブルを参照する他のテーブルへのカスケード削除で何が起こるかを確認します。また、削除関連トリガーを確認し、それらが何をしているかを確認します。

リモートサーバー自体も確認し、ハードドライブやドライブコントローラーの障害など、ハードウェアに問題がないことを確認します。かつては、非常に遅いことに苦しんでいたデータベースがありました。犯人が故障したRAIDカードであると最終的に特定するのに1か月かかりました。

これらのいずれも原因でない場合は、2つのサーバー間のネットワーク上でスループットテストを実行して、実際に帯域幅を取得していることを確認してください。その20MBit接続を共有している他のデータを調べてください。おそらく、ある時点で過負荷/障害のあるルーターまたはスイッチがあるか、ルーター/スイッチの1つに誤ったDNS情報があり、正しいパスに沿ってデータを送信できません。

他のヒント

あなたは Aから選択、Bに挿入、Aから削除?

次のことができます Aから選択し、Bに挿入 完了したら削除できます

また、一括操作(複数のProjectIDを選択)を使用して、他のサーバーに挿入することもできます。

ProjectIDがプライマリキー、またはクラスター化インデックスであることを確認してください。

また、必要ない場合は両方のサーバーですべてのロギング、バックアップ、変更追跡、統計を無効にすることができます

最終的に、マルチスレッドまたはマルチプロセスは、いくつかの利点をもたらします(サーバーBに挿入するときにサーバーAから選択します)。

サーバーbのテーブルをチェックして、トリガーがあるかどうかを確認しましたか? Perhpas彼らは減速を引き起こしています。

mysqldumpを使用することもできます:

mysqldump --complete-insert --create-options --add-locks --disable-keys --extended-insert --quick --quote-names -u $ user --password = $ password $ database | gzip --fast -c> {$ backupPath} / $ database。$ dateStr.sql.gz

次に、gzipで圧縮されたダンプをネットワーク経由で転送し、新しいデータベースにロードします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top