为什么索引 REBUILD 不会减少索引碎片?

jra*_*ara 31 index sql-server clustered-index fragmentation

我已经使用 ALTER INDEX REBUILD 来删除索引碎片。在某些情况下,REBUILD 似乎并没有消除这种碎片。REBUILD 不去除碎片的原因是什么?似乎这种情况尤其发生在小索引上。

Tho*_*ger 41

如果索引非常小(我相信少于 8 页),它将使用混合范围。因此,看起来好像仍然存在碎片,因为容纳范围将包含来自多个索引的页面。

正因为如此,而且在如此小的索引中,碎片通常可以忽略不计,您真的应该只重建具有特定页面阈值的索引。最佳做法是重建至少1000 页的碎片索引。


JNK*_*JNK 34

这也可能发生在非常大的索引上。

我在一个大约有 700m 行的表上有一些索引,我无法对低于 30% 的行进行碎片整理。问题是数据库内没有足够的连续可用空间来连续排列索引。

要解决不会进行碎片整理的非常大的索引,最佳解决方案是预先调整新数据库的大小并将所有对象移动到该数据库,然后在那里重新创建索引。