可能重复:
在具有聚集索引的表中删除命令太慢
我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
时会以相同的方式运行?SELECT
DELETE
- 为了
FK
让DELETE
_dbo.ProductOption
_dbo.ProductAttribute
_IS NULL
_WHERE
_检查)。 - 我查看了查询计划,最显着的成本是“Clustered Index Delete”,成本为 59%——大多数其他步骤的成本在 0%-3% 之间。
关于如何加快此查询的任何建议?