SQL Server删除查询执行超时

时间:2014-11-20 14:33:28

标签: sql sql-server

我有大约2 000 000条记录的统计表,我需要删除超过一个月的记录。

在下面执行DELETE查询时,我收到Time Out错误。它可以与索引相关吗?我不确定问题出在哪里以及如何解决。

DELETE FROM Statistic WHERE (DateStamp < DATEADD(mm, -1, GETDATE()))

我也在添加执行计划

enter image description here

图片网址:http://i.stack.imgur.com/wfh6k.png

3 个答案:

答案 0 :(得分:1)

如您提供的计划执行计划中所示,花费的主要时间是在删除所有数据后更新索引(准备表,排序数据并重新编制索引)。删除本身正在快速运行。

我建议您查看是否可以删除Statistic上的所有索引({1}}除外,因为删除命令和IX_DateStamp将使用该索引,因为那样在执行删除之前看起来是你的主键索引,然后在删除命令完成后重新创建它们。

请记住,如果您要删除索引,那么在生产数据库环境中尝试从PK_dbo.Statistic检索数据而删除这些索引的任何查询都将非常缓慢。因此,这可能需要作为维护窗口的一部分进行安排。

答案 1 :(得分:0)

您可以采取以下措施:

DELETE 
FROM Statistic 
WHERE PK IN (
            SELECT PK
            FROM Statistic WITH (NOLOCK)
            WHERE (DateStamp < DATEADD(mm, -1, GETDATE()))
            )

答案 2 :(得分:0)

假设您有一个聚簇索引(我无法判断您是否这样做),禁用聚簇索引将使整个表无法访问,并且无论如何您都无法在表上运行DELETE。它将失败:

  

查询处理器无法生成计划,因为索引...   被禁用。

如果要删除(或插入)超过10%的表,则应删除所有非群集索引,删除记录,然后重建非群集索引。

如果您删除的表格少于10%,请保留索引。