我有大约2 000 000条记录的统计表,我需要删除超过一个月的记录。
在下面执行DELETE查询时,我收到Time Out错误。它可以与索引相关吗?我不确定问题出在哪里以及如何解决。
DELETE FROM Statistic WHERE (DateStamp < DATEADD(mm, -1, GETDATE()))
我也在添加执行计划
答案 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%,请保留索引。