DELETE查询需要很长时间才能执行 - 如何优化?

时间:2013-01-02 23:40:30

标签: sql sql-server query-optimization

  

可能重复:
  DELETE Command is too slow in a Table with Clustered Index

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

到目前为止,我的调查结果如下:

  • 用临时表替换@UpdatedProducts(由于它的大小) - 这没什么区别。
  • 当我将查询转换为SELECT时,它运行得非常快(几秒钟)。所以我不确定我的JOIN是否存在问题,因为在执行SELECTDELETE时这可能会有同样的问题?
  • 有几个FK个约束需要验证才能让DELETE成功 - 基本上我们需要确保dbo.ProductOption中没有更多的条目引用我们尝试在dbo.ProductAttribute中删除的行(这是IS NULL子句中的WHERE检查所检查的行。)
  • 我查看了查询计划,最重要的成本是“聚集索引删除”,成本为59% - 其他大多数步骤的成本介于0%-3%之间。

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

0 个答案:

没有答案