1

可能重复:
在具有聚集索引的表中删除命令太慢

DELETE在我的 SQL Server 2005 数据库上运行以下查询:

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查询正在影响约 3K 行

以下是我迄今为止的发现:

  • 替换@UpdatedProducts为临时表(由于它的大小)——这没什么区别。
  • 当我将查询转换为 aSELECT时,它运行得非常快(几秒钟)。所以我不确定 my 是否有问题,因为大概这在执行orJOIN时会以相同的方式运行?SELECTDELETE
  • 为了FKDELETE_ dbo.ProductOption_ dbo.ProductAttribute_ IS NULL_ WHERE_检查)。
  • 我查看了查询计划,最显着的成本是“Clustered Index Delete”,成本为 59%——大多数其他步骤的成本在 0%-3% 之间。

关于如何加快此查询的任何建议?

4

0 回答 0