-1

データが定期的に MS SQL DB に挿入され、Web アプリケーションを使用してこのデータをユーザーに表示する実行中のシステムがあります。

データの挿入中、ユーザーは引き続き DB を使用できるはずですが、残念ながら、今のところシステム全体を再設計することはできません。2 時間ごとに 40k ~ 80k のレコードが挿入されます。

現在、プロセスは次のようになっています。

  1. 一時テーブルが作成されます
  2. データは、プレーンな INSERT ステートメントを使用して挿入されます (パラメーター化されたクエリまたはストアド プロシージャーを使用すると、速度が向上するはずです)。
  3. 次を使用して、データが一時テーブルから宛先テーブルにポンプされますINSERT INTO MyTable(...) SELECT ... FROM #TempTable

そのようなアプローチは非常に非効率的だと思います。なるほど、挿入フェーズは改善できますが (一括挿入ですか?)、一時テーブルから宛先へのデータ転送はどうでしょうか?

4

2 に答える 2

2

これは私たちが数回行った方法です。テーブルの名前を TableName_A に変更します。そのテーブルを呼び出すビューを作成します。最初のテーブルとまったく同じように 2 番目のテーブルを作成します (Tablename_B)。最初のデータを入力します。次に、ビューによって呼び出されていないテーブルにデータを入力するようにインポート プロセスを設定します。次に、代わりにそのテーブルを呼び出すようにビューを変更します。ユーザーの合計ダウンタイムは数秒です。次に、最初のテーブルを再作成します。テーブルを切り捨ててデータを入力できれば、最後の手順は必要ないので実際には簡単ですが、入力データが完全に更新されていない場合は不可能な場合があります。

于 2013-05-07T13:38:23.460 に答える
1

テーブルへの挿入時にロックを回避することはできません。BULK INSERT を使用しても、これは不可能です。

ただし、同時 INSERT 操作中にこのテーブルにアクセスしたいクライアントは、トランザクション分離レベルを READ UNCOMMITTED に変更するか、WITH NOLOCK オプションを指定して SELECT コマンドを実行することでアクセスできます。

INSERT コマンドは引き続きテーブル/行をロックしますが、SELECT コマンドはこれらのロックを無視し、コミットされていないエントリも読み取ります。

于 2013-05-07T12:50:50.423 に答える