SQL Server 如何减少索引碎片?

dsu*_*sum 7 index sql-server maintenance fragmentation

如果用户从不运行REBUILDREORGANIZE在他们的数据库上运行,SQL Server 是否仍然以某种方式对索引进行碎片整理?

MSDN 建议,如果索引超过 30% 的碎片,建议运行REBUILD而不是REORGANIZE. REORGANIZE多次运行会做同样的事情REBUILD吗?

我对此感到疑惑,因为我有一个具有高度碎片化索引的客户端。他们REORGANIZE每个周末都运行该索引,随着时间的推移,他们的索引似乎被整理了碎片。

这有意义吗?

Mar*_*ith 11

不,没有索引的自动神奇碎片整理。如果您有碎片,则需要REBUILDREORGANIZE

重新组织索引通过物理重新排序页面以匹配逻辑顺序来对索引的叶级进行碎片整理。锁定持续时间很短,将导致最小的查询阻塞。

Rebuild 删除一个索引并构建一个新的。对于企业版,如果索引不包含任何 LOB 类型,这可以作为在线操作完成。使用标准版或存在 LOB 类型的情况下,会导致阻塞。有关联机重建如何与用户操作同时发生的说明,请参见联机索引操作的工作原理

Reorganize vs Rebuild 建议大致是通过重组进行碎片整理所需的工作量与重建相当的阈值,即在 >30% 的碎片化时,与重建相比,完成重组需要更多的资源和更长的时间。

多次重组运行不会进一步对索引进行碎片整理。


JNK*_*JNK 6

如果用户从未在数据库上运行 REBUILD 或 REORGANIZE,SqlServer 引擎会整理索引吗?

不。

多次运行 REORGANIZE 会和 REBUILD 做同样的事情吗

也没有。

AREORGANIZE根据索引规范将叶页(保存实际索引数据的页)重新排序为正确的顺序。也可以合并页面并删除空页面,但不会分配新页面,也不会重建 btree 结构和统计信息。

AREBUILD删除旧索引并从头开始创建。这将更新所有 b 树结构,删除不需要的松弛空间,并将碎片设置为 0(或在数据库中空闲页面的连续性允许的情况下接近 0)。


Mar*_*ith 5

没有 SQL Server 不进行任何类型的自动维护。

REORGANIZE在第一次成功运行后多次运行将没有效果(忽略自重新组织后修改的页面或无法锁定的页面,因此在第一次尝试时跳过)。

它将乱序页面交换为正确的顺序,因此一旦完成并且它们都处于正确的顺序,额外的运行将无效。它无法消除由于非连续分配而产生的碎片。为此,您需要重建。