2

データを変換し、変換された (数百万行) データを SQL Server に書き込むサービスを実行しています。フロントエンドはこれらのテーブルから読み取ります。

当然のことながら、読み取りパフォーマンスを犠牲にすることなく、このデータをできるだけ高速に書き込みたいという野心があります。

私の現在のアプローチは、一度に 1 つのサーバー呼び出しで、個々の行を書き込むことです。これはロックを最小限に抑えるように見えますが、書き込み速度は最適ではありません。スロットルなしで、1 秒あたりおそらく数千行を達成しています。

データの一括読み込みも試みましたが、デッドロックとタイムアウトが発生しました。これは、挿入/更新時のロックのエスカレーションが原因であると想定しています (256 行のチャンクでコミットをバッチ処理します)。

読み取りパフォーマンスを犠牲にすることなく、レコードをデータベースにコミットするより高速な方法についてのアイデアはありますか?

いくつかの詳細:

  • 変換されたデータは多数の異なるテーブルに存在し、読み取りパフォーマンスを最大化するためにすべてインデックスが付けられます。
  • データの書き込みには、継続的に開いている単一の接続を使用します。
4

1 に答える 1

1

これは、SQL Server 2008 以降を使用していることを前提としていますが、使用している場合は、テーブル値パラメーターを受け入れるストアド プロシージャの使用を検討します。その後、任意のバッチ サイズでそのプロシージャを呼び出すことができ、ロックはそれらの行を挿入するのにかかった時間だけ保持されます。一括コピーを実行している場合、コピー中はロックが保持されるため、バッチ サイズを変更してもロック期間に大きな影響はありません (もちろん、全体的な一括コピー時間の変更は除きます)。 .

データを TVP として簡単に送信するためのヘルパー クラスを含むブログ記事をここに書きました。また、MSDN の TVP パラメータを使用したプロシージャの作成については、こちらを参照してください。ここここにある Bob B のブログ記事も読む価値があります(私のブログ投稿でも参照されています)。

于 2012-11-16T13:55:13.973 に答える