jrara Asked: 2012-05-25 10:03:58 +0800 CST2012-05-25 10:03:58 +0800 CST 2012-05-25 10:03:58 +0800 CST 为什么索引 REBUILD 不能减少索引碎片? 772 我使用 ALTER INDEX REBUILD 来删除索引碎片。在某些情况下,REBUILD 似乎并没有消除这种碎片。REBUILD 不去除碎片的原因是什么?似乎这种情况尤其发生在小索引上。 sql-server index 3 个回答 Voted Best Answer Thomas Stringer 2012-05-25T10:09:25+08:002012-05-25T10:09:25+08:00 如果索引非常小(我相信少于 8 页),它将使用混合范围。因此,它看起来好像仍然存在碎片,因为住房范围将包含来自多个索引的页面。 正因为如此,以及在碎片通常可以忽略不计的如此小的索引中,您实际上应该只重建具有特定页面阈值的索引。最好的做法是重建至少1000 页的碎片索引。 JNK 2012-05-25T11:28:03+08:002012-05-25T11:28:03+08:00 这也可能发生在非常大的索引上。 我在一个大约有 7 亿行的表上有一些索引,我无法对低于 30% 左右的数据进行碎片整理。问题是数据库内没有足够的连续可用空间来连续排列索引。 要解决不会进行碎片整理的非常大的索引,最好的解决方案是预先调整新数据库的大小并将所有对象移动到该数据库,然后在那里重新创建索引。 vikjon0 2019-10-22T03:53:02+08:002019-10-22T03:53:02+08:00 我已经为此苦苦挣扎了一段时间,就像JNK一样,尽管问题是磁盘上的可用空间和物理碎片持续存在。但是,在 SSD SAN 上你会怎么做呢? 我现在发现只包含 index_level=0 可能是个好主意。这就是在 Ola Hallengren 的剧本中完成的。 另一个改进是做 REBUILD With (maxdop = 1) 这样您就可以确保最大程度的改进。
如果索引非常小(我相信少于 8 页),它将使用混合范围。因此,它看起来好像仍然存在碎片,因为住房范围将包含来自多个索引的页面。
正因为如此,以及在碎片通常可以忽略不计的如此小的索引中,您实际上应该只重建具有特定页面阈值的索引。最好的做法是重建至少1000 页的碎片索引。
这也可能发生在非常大的索引上。
我在一个大约有 7 亿行的表上有一些索引,我无法对低于 30% 左右的数据进行碎片整理。问题是数据库内没有足够的连续可用空间来连续排列索引。
要解决不会进行碎片整理的非常大的索引,最好的解决方案是预先调整新数据库的大小并将所有对象移动到该数据库,然后在那里重新创建索引。
我已经为此苦苦挣扎了一段时间,就像JNK一样,尽管问题是磁盘上的可用空间和物理碎片持续存在。但是,在 SSD SAN 上你会怎么做呢?
我现在发现只包含 index_level=0 可能是个好主意。这就是在 Ola Hallengren 的剧本中完成的。
另一个改进是做
这样您就可以确保最大程度的改进。