1

Tab_Log1 日あたり数千行でいっぱいになるテーブルがあります。毎週、作成日に基づいて行の 90% をスクラブする必要があります。ステートメントを使用するdeleteと機能しますが、すべての削除がログに記録されるため、リソースを大量に消費します。2 番目に考えたのは、削除したくないデータをTab_Log一時テーブルにtruncate Tab_Log挿入してから、一時テーブルのレコードを挿入し直すことでした。私の懸念は、このプロセス中にユーザーがTab_Log切り捨て中にクエリを実行して再実行できる可能性があることです。 -プロセスを挿入し、受信してエラー。

では、ユーザーにエラーを発生させることなく、このテーブルをすばやくスクラブするにはどうすればよいでしょうか? テーブルを安全にロックして、着信クエリ要求がエラーになるのではなく待機する方法はありますか?

4

2 に答える 2

1

バッチで削除を行うことをお勧めします。

WHILE 1 = 1 
  BEGIN; 
    DELETE TOP(500) FROM Tab_Log WITH(ROWLOCK) WHERE CreateDate = zyz; 
    IF @@RowCount = 0 BREAK; 
  END;
于 2013-10-31T15:15:26.817 に答える
1

明らかな回避策。

1 - SqlAgent を使用して、日曜日の午前 3 時に 90% の削除をスケジュールします。

2 -- 小さいチャンクでレコードを削除することにより、データベースを強制終了せずに削除を実行します。

たとえば、選択するレコードのすべての主キーの主キーを一時テーブルに入力します。(これを行うと、マスター テーブルを繰り返しスキャンする必要がなくなります。日付フィールドでインデックスが作成されている場合は、上位 100 を削除するだけです)

他のユーザーにチャンスを与えるために 2 秒間スリープします。

削除するものがなくなるまで繰り返します

必要に応じてこのアルゴリズムを調整してください。

于 2013-10-31T15:21:59.183 に答える