SQL Server 2005 データベースがあり、数百万行 (列が 3 つしかない)DELETE
のテーブルからのレコードの処理を高速化するために、適切なフィールドにインデックスを配置しようとしましたが、実行時間がさらに長くなりました! (例: 1 時間対 13 分)big_table
DELETE
テーブルとの間に関係があり、フィルター処理する列DELETE
は他のテーブルにあります。例えば
DELETE FROM big_table
WHERE big_table.id_product IN (
SELECT small_table.id_product FROM small_table
WHERE small_table.id_category = 1)
ところで、私も試しました:
DELETE FROM big_table
WHERE EXISTS
(SELECT 1 FROM small_table
WHERE small_table.id_product = big_table.id_product
AND small_table.id_category = 1)
最初のものよりもわずかに速く実行されているように見えますが、インデックスを使用すると、使用しない場合よりもはるかに遅くなります。
これらのフィールドにインデックスを作成しました。
big_table.id_product
small_table.id_product
small_table.id_category
.ldf ファイルは、.ldf ファイルの実行中に大きくなりDELETE
ます。
DELETE
テーブルにインデックスがあるとクエリが遅くなるのはなぜですか? 彼らはもっと速く走るべきだと思った。
アップデート
DELETE
さて、コンセンサスは、インデックスを更新する必要があるため、インデックスが大幅に遅くなるということです。DELETE
ただし、すべての行を一度にすべて取得できず、最後にインデックスを 1 回だけ更新できない理由はまだわかりません。
私はいくつかの読書から、句DELETE
内のフィールドの検索を高速化することでインデックスが高速化されるという印象を受けました。WHERE
「インデックスは、SELECT ステートメントの場合と同様に、DELETE および UPDATE コマンドでレコードを検索する場合にも機能します。」
ただし、記事の後半で、インデックスが多すぎるとパフォーマンスが低下する可能性があると述べています。
ボブの質問への回答:
- テーブル内の 5,500 万行
- 4,200 万行が削除されています
- 同様の
SELECT
ステートメントは実行されません (タイプ 'System.OutOfMemoryException' の例外がスローされました)。
次の2つのクエリを試しました:
SELECT * FROM big_table
WHERE big_table.id_product IN (
SELECT small_table.id_product FROM small_table
WHERE small_table.id_category = 1)
SELECT * FROM big_table
INNER JOIN small_table
ON small_table.id_product = big_table.id_product
WHERE small_table.id_category = 1
SQL Server 2005 からの次のエラー メッセージで25 分間実行した後、両方とも失敗しました。
An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown.
データベース サーバーは、7.5 GB RAM を搭載した古いデュアル コア Xeon マシンです。これは私のおもちゃのテストデータベースです:)ので、他には何も実行していません。
CREATE
インデックスを適切に機能させるために、インデックスを作成した後に何か特別なことをする必要がありますか?