0

同様のテーマで私が見たほとんどの質問は、テーブルへの挿入を高速化する方法に関するものです。

削除を高速化するために何ができるか知りたいですか?

テーブルを切り捨てたり削除したりすることはできません。次のようなことをする必要があります

DELETE FROM table WHERE id IN (SELECT id FROM other_table)
4

5 に答える 5

1

ケースによって異なるため、特定のヘルプはありません。

一般的な規則 (該当する場合):

  1. table.id の非クラスター化インデックスを持つ
  2. ただし、まったくまたはほとんど使用されない他のすべてのキー/インデックスを削除します
  3. 削除操作の前に他のすべてのキー/インデックスを削除し、後で再構築します
  4. table.id のカスタード インデックスを避ける
  5. インデックスを使用して "SELECT id FROM other_table" を高速化します (このサブセレクトには、現実世界で何らかの種類の where 句があると仮定します)。
于 2010-07-15T07:03:54.300 に答える
1

従うべきいくつかの一般的なアイデア。

  • クラスター化インデックスを持つ列から削除していないことを確認してください。
  • 行の他の列にキーまたはインデックスがあることを確認してください。
  • 選択部分で大量のレコードを選択していないことを確認してください。

それ以外は、減速の原因についての主観的な推測にすぎません。最善の方法は、さまざまなことを試して、何が役に立ち、何が遅くなるかを確認し、delete が呼び出されたときに行内のアイテムがどのように検出されるかを理解し、そこで何が最も長くかかっているかを確認することです。

于 2010-07-19T01:30:18.893 に答える
1
  • バッチ処理
  • EXISTS を使用
  • 両方のテーブルの id に正しいインデックスがあることを確認してください

例:

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 億行の削除

于 2010-07-31T05:27:17.620 に答える
0

一度に 1000 レコードなど、小さなバッチで削除します。実際の削除にはもう少し時間がかかりますが (必要なインデックスが配置されていることを確認してください)、長時間の削除の実行中にユーザーがテーブルからロックアウトされることはありません。

于 2010-07-19T00:51:25.170 に答える
0

「テーブル」の「id」列にインデックスがありますか?
そうでない場合、SQL Server はおそらくテーブル スキャンを実行して、削除するレコードを見つけます。「id」列にインデックスを作成することで、これを高速化できます。

「other_table」と同じ - そのテーブルの選択に WHERE 句もある場合は、そこで使用されている列にインデックスが付けられているかどうかを確認します。

于 2010-07-15T06:58:53.843 に答える