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を実行するときに同じように実行されるため、に問題があるかどうかはわかりません。SELECTDELETE FKを成功させるために検証する必要がある制約がいくつかあります。基本的には、削除しようとしている行を参照しているDELETEエントリがこれ以上ないことを確認する必要があります(これが句のチェックです)。をチェックしています)。dbo.ProductOptiondbo.ProductAttributeIS NULLWHERE- クエリ プランを調べたところ、最も重要なコストは「クラスター化インデックスの削除」で、コストは 59% でした。他のほとんどのステップのコストは 0% ~ 3% です。
このクエリを高速化する方法についての推奨事項はありますか?