我已经使用ALTER INDEX REBUILD删除了索引碎片。在某些情况下,REBUILD似乎无法消除这种碎片。 REBUILD无法消除碎片的原因是什么?似乎这种情况尤其在索引较小的情况下发生。

评论

相关:dba.stackexchange.com/questions/5365/…

#1 楼

如果索引很小(我相信少于8页),它将使用混合范围。因此,由于住房范围将包含来自多个索引的页面,因此似乎仍然存在碎片。

由于这个原因,以及在如此小的索引中碎片是通常可以忽略不计,实际上只应重建具有特定页面阈值的索引。最佳做法是重建至少1000页的碎片索引。

#2 楼

如果索引很大,也会发生这种情况。

我在具有约700m行的表上有一些索引,但无法对30%以下的磁盘碎片整理。问题是数据库内部没有足够的连续可用空间来连续排列索引。

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

#3 楼

我一直在为此苦苦挣扎,就像JNK I一样,尽管问题仍然是磁盘上的可用空间和物理碎片。但是,您在SSD SAN上如何处理?

我现在发现只包含index_level = 0是一个好主意。这是在Ola Hallengren的脚本中完成的。

另一个改进是

 REBUILD With (maxdop = 1)


这样可以确保最大程度的改进。