我有一张约有550万条记录的表格。我需要根据日期删除一些记录。我的查询是这样的:删除需要很长时间
DELETE FROM Table WHERE [Date] between '2011-10-31 04:30:23' and '2011-11-01 04:30:42'
这是关于9000行,但这一操作持续很长的时间。我如何加快速度? Date是datetime2的类型,表中有int主键聚簇。更新和删除触发器被禁用。
我有一张约有550万条记录的表格。我需要根据日期删除一些记录。我的查询是这样的:删除需要很长时间
DELETE FROM Table WHERE [Date] between '2011-10-31 04:30:23' and '2011-11-01 04:30:42'
这是关于9000行,但这一操作持续很长的时间。我如何加快速度? Date是datetime2的类型,表中有int主键聚簇。更新和删除触发器被禁用。
指数首先要确保你有约会的索引。
如果有索引检查执行计划并确保它正在使用它。请注意,并不总是使用索引是处理删除的最有效方法,因为如果删除大部分记录(经验法则超过10%),索引查找的额外开销up可以比全面扫描更大。
对于大型表格,它也非常值得确保统计数据是最新的(运行sp_updatestats),因为如果数据库对表格中的行数有不正确的理解,它会在其执行计划中做出不恰当的选择。例如,如果统计信息不正确,数据库可能会决定忽略您的索引(即使它存在),因为它认为表中的记录少得多。日期的奇怪分布可能具有相似的效果。
我可能会尝试删除日期索引,然后重新创建它。索引是二叉树,为了有效地工作,他们需要平衡。如果您的数据随着时间的推移而积累起来,那么索引可能会不平衡,查询可能需要很长时间才能找到适当的数据。这个和统计问题都应该由您的数据库维护工作自动处理,但通常会被忽略。
最后,你不要说表中是否有许多其他索引。如果存在,那么您可能会遇到数据库在进行删除以及更新索引时必须重新组织索引的问题。这有点激烈,但一种选择是在运行删除之前删除表中的所有其他索引,然后再次创建它们。
是否有'[Date]'上的索引? –
请考虑将您的专栏重命名为日期以外的内容。它从来没有**一个好主意,使用与保留字相同的列名。在某种程度上,你最终会陷入痛苦的世界。它也很懒 - 这不是日期,它是创建日期或发布日期或其他。适当命名它。 – Cruachan