为什么我们需要重建和重组 SQL Server 中的索引

Mou*_*rya 28 sql-server-2005 sql-server-2008 sql-server

在网上搜索后,我找不到原因

  1. 为什么我们需要在 SQL Server 中重建和重组索引?

  2. 当我们重建和重组时,内部会发生什么?

网站上的一篇文章说:

当索引碎片大于 40% 时应该重建索引。当索引碎片在 10% 到 40% 之间时,应该重新组织索引。索引重建过程使用更多 CPU 并锁定数据库资源。SQL Server 开发版和企业版有 ONLINE 选项,可以在重建 Index 时开启。ONLINE 选项将在重建期间保持索引可用。

我无法理解这一点,虽然它说WHEN要这样做,但我想知道WHY我们是否需要重建和重组索引?

Pet*_*ter 29

当您执行插入更新和删除时,您的索引将在内部和外部变得碎片化。

内部碎片是指索引页上的可用空间百分比很高,这意味着 SQL Server 在扫描索引时需要读取更多页。

外部碎片是指索引的页面不再是有序的,因此SQL Server必须做更多的工作,尤其是在IO方面来读取索引。

如果您的索引变得过于碎片化,最好的情况是您的查询效率会降低,但最坏的情况是,SQL Server 将停止使用所有索引,这意味着几乎所有查询都必须执行表扫描或聚集索引扫描。这会严重影响你的表现!

当您重新组织索引时,SQL Server 将使用现有的索引页,并且只是在这些年龄上随机排列数据。这将减轻内部碎片,也可以去除少量的外部碎片。这是比重建更轻量级的操作,并且始终在线。

重建索引时,SQL Server 实际上重新使用索引的数据并使用一组新的索引页。这显然会缓解内部和外部碎片,但它是一个更重的操作,默认情况下会导致索引脱机,尽管它可以作为在线操作执行,具体取决于您的 SQL Server 版本和设置。

但是,请不要期望在重建后有 0 个碎片。除非您使用 MAXDOP 查询提示,否则 SQL Server 将并行化重建操作,并且涉及的处理器越多,碎片就越多,因为每个处理器或内核将单独重建它们的索引部分或片段,而不考虑彼此。这是最佳碎片级别和重建索引所用时间之间的权衡。对于接近 0 的碎片,使用 MAXDOP 1 并在 TempDB 中对结果进行排序。