删除需要很长时间

时间:2011-12-08 19:41:24

标签: tsql sql-server-2008r2-express

我有一张约有550万条记录的表格。我需要根据日期从中删除一些记录。我的查询如下:

DELETE FROM Table WHERE [Date] between '2011-10-31 04:30:23' and '2011-11-01 04:30:42'

这是大约9000行,但这个操作持续很长时间。我怎样才能加快速度? Date是datetime2的类型,表具有int主键聚类。更新和删除触发器已禁用。

2 个答案:

答案 0 :(得分:2)

很可能将[Date]强制转换为每一行的字符串,从而导致整个表的顺序扫描。

您应该尝试将参数转换为日期:

DELETE FROM Table WHERE [Date] between convert(datetime, '2011-10-31 04:30:23') and convert(datetime, '2011-11-01 04:30:42')

另外,请确保[Date]

上有索引

答案 1 :(得分:1)

首先确保你有一个日期索引。

如果有索引检查执行计划并确保它正在使用它。请注意,并不总是遵循使用索引是处理删除的最有效方法,因为如果要删除大部分记录(经验法则超过10%),索引的额外开销看起来 - up可以大于完整扫描。

使用大表,同样值得确保统计信息是最新的(运行sp_updatestats),因为如果数据库对表中的行数有不正确的理解,那么它将做出不适当的选择。它的执行计划。例如,如果统计信息不正确,数据库可能会决定忽略您的索引,即使它存在,因为它认为表中的记录数远远少于它。日期的奇怪分布可能会产生类似的影响。

我可能会尝试在日期中删除索引然后再次重新创建它。索引是二叉树,为了有效地工作,它们需要平衡。如果您的数据随着时间的推移累积,索引可能会不平衡,查询可能需要很长时间才能找到适当的数据。这个和统计问题都应该由您的数据库维护工作自动处理,但它经常被忽视。

最后你不要说表上是否有很多其他索引。如果有,那么您可能会遇到问题,因为数据库必须重新组织索引,因为它会进行删除以及更新索引。它有点激烈,但一个选项是在运行删除之前删除表上的所有其他索引,然后再创建它们。