据我了解,当您重建索引时,SQL 将在数据文件末尾对页面进行排序,增加数据文件直到所有页面都已排序,然后删除旧索引,在数据文件中留下空的非连续范围。
当您重建第二个索引时会发生什么?SQL 是否执行相同的操作,增加数据文件或将第二个索引移动到第一个索引留下的旧碎片范围中?如果它使用旧的范围,那么重建会创建一个新的物理碎片索引吗?
据我了解,当您重建索引时,SQL 将在数据文件末尾对页面进行排序,增加数据文件直到所有页面都已排序,然后删除旧索引,在数据文件中留下空的非连续范围。
当您重建第二个索引时会发生什么?SQL 是否执行相同的操作,增加数据文件或将第二个索引移动到第一个索引留下的旧碎片范围中?如果它使用旧的范围,那么重建会创建一个新的物理碎片索引吗?
首先,SQL Server 不一定在数据文件末尾为重建的索引分配区段(和混合区页)。否则,数据文件会不必要地增长。SQL Server 将尽可能从现有的空闲盘区分配空间,而不管它们位于数据文件中的什么位置。有关扩展管理的更多信息,请参阅页面和扩展架构指南。
索引重建后,所有原始索引空间都将变为未分配状态。即使旧索引是碎片化的(逻辑/物理顺序不同),生成的可用空间之后也可能是连续的,这取决于盘区所在的位置恰好位于文件中。后续的空间分配可以重用这个空间。
要回答问题标题中提出的问题,由于并行计划,新(重新)构建的索引可能会碎片化。可以指定 MAXDOP 1 来避免这种情况。在现有索引的情况下,可以改用 REORGANIZE。