同様のテーマで私が見たほとんどの質問は、テーブルへの挿入を高速化する方法に関するものです。
削除を高速化するために何ができるか知りたいですか?
テーブルを切り捨てたり削除したりすることはできません。次のようなことをする必要があります
DELETE FROM table WHERE id IN (SELECT id FROM other_table)
同様のテーマで私が見たほとんどの質問は、テーブルへの挿入を高速化する方法に関するものです。
削除を高速化するために何ができるか知りたいですか?
テーブルを切り捨てたり削除したりすることはできません。次のようなことをする必要があります
DELETE FROM table WHERE id IN (SELECT id FROM other_table)
ケースによって異なるため、特定のヘルプはありません。
一般的な規則 (該当する場合):
従うべきいくつかの一般的なアイデア。
それ以外は、減速の原因についての主観的な推測にすぎません。最善の方法は、さまざまなことを試して、何が役に立ち、何が遅くなるかを確認し、delete が呼び出されたときに行内のアイテムがどのように検出されるかを理解し、そこで何が最も長くかかっているかを確認することです。
例:
SELECT 'Starting'
WHILE ROWCOUNT <> 0
DELETE TOP (1000000) T
FROM table T
WHERE EXISTS (
SELECT * from otherTable OT WHERE T.id = OT.id
)
おそらくいくつかのインスピレーション: SQL Server 2008での一括削除と70 億行の削除
一度に 1000 レコードなど、小さなバッチで削除します。実際の削除にはもう少し時間がかかりますが (必要なインデックスが配置されていることを確認してください)、長時間の削除の実行中にユーザーがテーブルからロックアウトされることはありません。
「テーブル」の「id」列にインデックスがありますか?
そうでない場合、SQL Server はおそらくテーブル スキャンを実行して、削除するレコードを見つけます。「id」列にインデックスを作成することで、これを高速化できます。
「other_table」と同じ - そのテーブルの選択に WHERE 句もある場合は、そこで使用されている列にインデックスが付けられているかどうかを確認します。