可能重复:
在具有聚集索引的表中删除命令太慢
我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为临时表(由于它的大小)——这没什么区别。 - 当我将查询转换为 a
SELECT时,它运行得非常快(几秒钟)。所以我不确定 my 是否有问题,因为大概这在执行orJOIN时会以相同的方式运行?SELECTDELETE - 为了
FK让DELETE_dbo.ProductOption_dbo.ProductAttribute_IS NULL_WHERE_检查)。 - 我查看了查询计划,最显着的成本是“Clustered Index Delete”,成本为 59%——大多数其他步骤的成本在 0%-3% 之间。
关于如何加快此查询的任何建议?