我有一个相当大的表(>10M行),它具有频繁的crud操作。它有适当的索引,但它们很快就会变得支离破碎。如果没有定期的索引重组/重建维护计划,索引碎片很容易超过90%。
现在,我已经通过每天重新组织索引和每周进行重建来解决这个问题。我也玩了填充因子等,以保持较低的碎片。
我的主要问题是,当索引变得太零碎时,Server会忽略这些索引,而是执行完整的表扫描。当发生这种情况时,它几乎会杀死应用程序,因为对这样大的表进行多次扫描是非常繁重的。我确信在这种情况下使用分段索引会更快。
是否有一种方法可以让Server使用索引而不考虑其碎片?
发布于 2019-08-27 11:46:57
您可以使用索引提示来做到这一点:
SELECT *
FROM dbo.Users AS u WITH (INDEX = ix_definitely_an_index)
WHERE u.Reputation = 2;缺点是:
您还可以使用计划指南,它可以设置您想要的计划。
缺点是:
由于您使用的是Server 2017,所以您可能可以使用查询存储强制计划。这比使用“计划指南”容易得多,但您最终可能会得到一个意外计划。
缺点:
在不了解更多信息的情况下,我可能会更热衷于调查索引是否出于其他原因(如参数嗅探 )使用更改。
发布于 2019-08-29 19:26:55
下一次Server忽略索引时,尝试对该索引或整个表进行完全扫描来更新统计信息。如果这样做有效,那么碎裂就不是问题了。
另外,Server在选择计划时并不关心碎片问题,但是如果由于“内部碎片”而变得太大,它可能会忽略索引。请检查索引页内的空空间。
https://dba.stackexchange.com/questions/246355
复制相似问题