3

SQL Server に 1 日あたり約 3,000 万行の更新を挿入する必要があります。どのようなオプションがありますか?

SqlBulkCopy を使用すると、既存のデータを挿入しないように処理されますか?

私のシナリオでは、データを複製することなく、同じデータでこれを何度も実行できる必要があります。

現時点では、DataTable からデータを読み取る更新ステートメントと挿入ステートメントを含むストアド プロシージャがあります。

より良いパフォーマンスを得るために何を探すべきですか?

4

2 に答える 2

5

このようなことを行う通常の方法は、制約のない永続的な作業テーブル (またはテーブル) を維持することです。多くの場合、これらは同じサーバー上の別の作業データベースに存在する可能性があります。

データをロードするには、作業テーブルを空にし、BCP/一括コピーを介してデータを爆破します。データが読み込まれたら、新しく読み込まれたデータを準備するために必要なクリーンアップや変換を行います。それが完了したら、最後のステップとして、古いデータと新しいデータの間の差分を実装するために必要な更新/削除/挿入操作を実行するか、実際のテーブルを単純に切り捨てて再ロードすることにより、データを実際のテーブルに移行します。

もう 1 つのオプションは、安定したデータの流れに似たものがある場合、データの到着を監視するデーモンを設定してから挿入を行うことです。たとえば、データがフラット ファイルであり、FTP などを介してディレクトリにドロップされる場合、デーモンはディレクトリの変更を監視し、データが到着したときに必要な作業を (上記のように) 実行できます。

これが本番システムである場合に考慮すべきことの 1 つは、大規模な挿入/削除/更新ステートメントを実行すると、トランザクションの進行中にブロックが発生する可能性があることです。また、失敗してロールバックする巨大なトランザクションには、独自の欠点があります。

  • ロールバックの処理にはかなりの時間がかかる場合があります。
  • ロールバック中はロックが保持されるため、データベースでブロックやその他の競合が発生する可能性が高くなります。
  • 最悪の場合、すべてのことが起こった後、いわば前進する動きを達成していません。多くの時間と労力を費やして、最初の場所に戻っています。

したがって、状況によっては、確実に前進できるように、挿入/更新/削除を小さなバッチで実行する方がよい場合があります。24 時間にわたる 3000 万行は c になります。毎秒350。

于 2013-01-11T19:00:05.937 に答える
2

保留テーブルに一括挿入してから、単一の Merge ステートメントまたは Update および Insert ステートメントのいずれかを実行します。どちらの方法でも、ソース テーブルと保持テーブルを比較して、実行するアクションを確認します。

于 2013-01-11T19:00:49.507 に答える