1. ホーム
  2. sql

[解決済み] SQLのDelete文が非常に遅い

2023-07-01 03:04:11

質問

このようなステートメントがありますが、タイムアウトしてしまいます。

DELETE FROM [table] WHERE [COL] IN ( '1', '2', '6', '12', '24', '7', '3', '5')

こんな感じで1つずつやってみました。

DELETE FROM [table] WHERE [COL] IN ( '1' )

で、今のところ22分、まだ続いています。

テーブルには26万行があり、4列になっています。

なぜこれほど遅くなるのか、どのように高速化するのか、どなたかお分かりになる方はいらっしゃいますか? WHERE を行っている [COL] には、一意でない、クラスター化されていないインデックスがあります。 SQL Server 2008 R2 を使用しています。

update: このテーブルにはトリガーがありません。

どのように解決するのですか?

削除が遅くなる原因となるもの。

  • 多くのレコードを削除する
  • 多くのインデックス
  • 子テーブルの外部キーにインデックスがない。(コメントで言及してくださった @CesarAlvaradoDiaz さん、ありがとうございました)
  • デッドロックとブロッキング
  • トリガー
  • カスケード削除(10個の親レコードを削除すると、数百万個の子レコードが削除されることになります。 何百万もの子レコードが削除されることになる)
  • トランザクション ログが増大する必要がある
  • チェックすべき外部キーが多い

つまり、ブロックしているものを見つけて修正するか、通常の生産負荷に干渉しない時間帯に削除を実行するかという選択肢があります。削除はバッチで実行できます (トリガー、カスケード削除、または多数のレコードがある場合に便利です)。インデックスを削除して再作成することができます(これも営業時間外に行うことができれば最高です)。