我有一个有17,093,139行的大堆表。此表是数据库中使用最频繁的表。因为这是一个堆表,所以这个表中只有非聚集索引。我定期在此表上重建/重新组织分段索引。
现在,我们经常面临这个问题:访问此表的许多查询会突然开始比平常花费更长的时间。当我检查时,我注意到查询的执行计划已经改变了。
我创建并删除了一个随机的非聚集索引,这解决了这个问题。
我不明白的是,是什么导致了这些突然的缓慢,在任何时候,创建和删除索引在表的后台做什么来修复索引重建工作没有做的事情?
我需要找出触发这些减速的确切原因,这样就可以找到一个永久的解决方案,因为我不能每次都不停地创建和删除索引来解决这个问题。
这里的任何帮助都将不胜感激。
发布于 2020-05-19 10:00:51
删除表上的索引将刷新从缓存中引用此表的执行计划。(我认为索引需要包含查询中引用的列,但不能100%肯定)。
然后,SQL构建一个新的执行计划,“修复”您的问题。
您可以尝试重新构建统计数据(而不是删除索引),或者手动删除执行计划(请参阅Sp_blitz存储过程以轻松获得命令)。您可能会有相同的行为(查询修复)。如果是这样,那么您可能希望阅读有关参数嗅探的问题。
附注:这是很少有一个好的实践,有一个没有集群索引的表。通常,我看到的唯一好的情况是在日志表中,您希望很快完成插入.但是在您的情况下,如果您有非聚集索引,那么无论如何您都会为插入设置开销。
发布于 2020-05-19 14:08:36
你可能看到的可能与参数嗅探有关-
1-也许您应该捕获缓慢的计划,并将其保存到以后的新计划中进行比较。
在此基础上,你可以更进一步。但在此之前,最好能知道情况是否真的如此。
https://dba.stackexchange.com/questions/267472
复制