3

このような理由は何ですか

DECLARE @i int = 0
WHILE @i < 100 BEGIN
  BEGIN TRAN
    SET @i = @i + 1

    DELETE TOP (20) st
    FROM SomeTable st
    JOIN #ToDelete ON #ToDelete.Id = st.Id
  COMMIT
END

このようなものの代わりに使用する必要がありますか?

DELETE st
FROM SomeTable st
JOIN #ToDelete ON #ToDelete.Id = st.Id
4

1 に答える 1

11

多数のレコードを削除すると、いくつかのことが起こる可能性があります。

最初に、カスケード削除を有効にしている可能性があります。この場合、メイン テーブルから 10000 レコードを削除すると、すべての子テーブルを考慮すると数百万のレコードが削除される可能性があります。カスケード デルテがなくても、子テーブルが多数ある場合は、削除を実行する前にすべてのレコードをチェックして、レコードがないことを確認する必要があります。

さらに、このような削除を行うと、テーブルのロックがエスカレートし、削除の実行中に他の誰もテーブルを使用できなくなる可能性があります。カスケード削除を使用すると、プロセスに時間がかかり、さらに多くのテーブルがロックされる可能性があるため、これはさらに問題になります。

大規模な削除が特に遅くなる原因となるもう 1 つのことは、テーブルにトリガー、特に何らかのループがあるトリガーがある場合です。

一般に、この手法は、多数のレコードの削除に時間がかかりすぎて、その間にブロックが発生する場合に使用されます。通常、一度に 1 行ずつ処理するよりも処理速度が速いため、バッチ処理を行います。

これは、レコードのバッチを削除するたびに使用する必要があるテクニックではありません。子レコードやトリガーがないテーブルで削除に数秒かかる場合は、その必要はありません。他の人が通常、削除と同時にアクセスするテーブルでない場合 (営業時間外に削除を行うジョブなど)、この手法を使用する必要はありません。

于 2013-10-16T14:41:32.460 に答える