0

当面の問題は、このテーブルを使用する他のプロセスでデッドロックを引き起こすことなく、テーブルから約 60M のレコードを削除する必要があることです。この時点で、一度に約 1M のレコードしか処理しない while ループを使用してレコードを削除する作業がほぼ完了しましたが、それには 1 日かかります。

Q1: テーブルをオンラインに保ち、MS SQL Server 2005 でこのテーブルを使用する必要がある他のリソースへの影響を最小限に抑えながら、テーブルから大量のデータを削除する最適な方法は何ですか?

Q2: Oracle のように、SQL Server で個別の行ロック (テーブル ロックではなく) を実装する方法はありますか? (これに答えるとQ1に答えるかもしれないことに注意してください)。

A2: @Remus Rusanu が教えてくれたように、削除で行レベルのロックを行う方法があります。

4

3 に答える 3

1

最も効率的な方法は、パーティションスイッチングを使用することです。パーティションスイッチングを使用してデータを効率的に転送するを参照してください。欠点は、パーティションの展開方法を事前に計画する必要があることです。

パーティションの切り替えが利用できない場合、答えは実際のテーブルスキーマによって異なります。実際のスキーマ(すべてのインデックス、最も重要なのはクラスター化されたキーの定義を含む)と、削除候補を修飾する基準を投稿することをお勧めします。

Q2に関しては、SQL Serverは90年代半ばから行レベルのロックがありましたが、実際に何を求めているのかわかりません。

于 2010-01-04T21:11:30.923 に答える