SQL Server 2005 データベースで次のDELETE
クエリを実行しています。
DELETE
pa
FROM
dbo.ProductAttribute pa
INNER JOIN
dbo.Product p ON pa.ProductID = p.ProductID
INNER JOIN
@UpdatedProducts up ON p.ProductID = up.ProductId
LEFT JOIN
dbo.ProductOption pos ON pa.ProductOptionID = pos.StartProductOptionId
LEFT JOIN
dbo.ProductOption pof ON pa.ProductOptionID = pof.FinishProductOptionId
WHERE
p.ProductTypeID = 1
AND
pos.StartProductOptionId IS NULL
AND
pof.FinishProductOptionId IS NULL
このクエリは、データ セットに対して実行に時間がかかります (最大 18 分)。
ここにいくつかのコンテキストがあります:
@UpdatedProducts
〜90K行のテーブル変数です- 参加しているすべての列にインデックスが付けられています
DELETE
クエリは最大 3,000 行に影響しています
これまでの私の調査結果は次のとおりです。
- (サイズが大きいため)一時テーブルに置き換えまし
@UpdatedProducts
た-これはほとんど違いがありませんでした。 - クエリを に変換すると、
SELECT
非常に高速 (数秒) に実行されます。おそらくこれは、またはJOIN
を実行するときに同じように実行されるため、に問題があるかどうかはわかりません。SELECT
DELETE
FK
を成功させるために検証する必要がある制約がいくつかあります。基本的には、削除しようとしている行を参照しているDELETE
エントリがこれ以上ないことを確認する必要があります(これが句のチェックです)。をチェックしています)。dbo.ProductOption
dbo.ProductAttribute
IS NULL
WHERE
- クエリ プランを調べたところ、最も重要なコストは「クラスター化インデックスの削除」で、コストは 59% でした。他のほとんどのステップのコストは 0% ~ 3% です。
このクエリを高速化する方法についての推奨事項はありますか?