1

重複の可能性:
DELETE コマンドは、クラスター化インデックスを含むテーブルで遅すぎる

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% です。

このクエリを高速化する方法についての推奨事項はありますか?

4

0 に答える 0