【问题标题】:Rebuilding large SQL indexes isn't changing the fragmentation percentage重建大型 SQL 索引不会改变碎片百分比
【发布时间】:2009-08-13 20:05:14
【问题描述】:

我有一个在 SQL Server 2005 上运行的大型数据库。我查询 DMV sys.dm_db_index_physical_stats 以获取索引碎片信息。

看到 avg_fragment_size_in_percent 报告大量具有非常糟糕的碎片级别的索引(其中很多索引为 99%),我感到很震惊。这些是在具有重要页数的表上(最小的页数超过 500 页)。

我对最严重的违规者进行了以下操作:

ALTER INDEX ALL ON myTable REBUILD WITH(ONLINE = ON)

然后我重新查询了 sys.dm_db_index_physical_stats,但是它报告了索引 REBUILD 前后完全相同的碎片级别。

这些信息是被缓存了,还是我做错了什么?

【问题讨论】:

  • 您能告诉我们该索引的索引定义是什么吗?包括哪些字段(它们的数据类型是什么)?
  • 当然……我目前最严重的违规者之一是恰好是外键的唯一标识符索引(单列索引)。这个显示 99.5991983967936% 的平均碎片。
  • 嗯...我在 MSDN 上发现这篇文章报告了相同的行为:social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/…
  • 我也有这个问题。我做了一个测试并重建了一个索引,然后检查了碎片,它说它是 100% 碎片的。然后我使用 SQL Management Studio 进行检查,它告诉我它有 0.29% 的碎片。数据必须缓存,但如何强制它更新统计信息?

标签: sql sql-server sql-server-2005


【解决方案1】:

您可能需要检查索引的 FILLFACTOR 参数 - 这会严重影响您的索引碎片。

在包含大量插入、更新、删除的“繁忙”索引上,您通常应该选择 70% 到 90% 之间的填充因子 - 取决于您拥有多少 varchar() 字段。

在不断增加的索引(尤其是聚集索引)上(通常是 INT IDENTITY),您可以使用 FILLFACTOR 0(或 100 - 两者含义相同),您只会看到删除产生的碎片。

要指定 FILLFACTOR,请使用以下语法:

ALTER INDEX (indexname) 
  ON myTable REBUILD 
  WITH (ONLINE = ON, FILLFACTOR = 80)

以下是有关填充因子及其对性能影响的更多信息:

希望这会有所帮助!

马克

【讨论】:

    【解决方案2】:

    你确定你得到了索引的碎片吗? sys.dm_db_index_physical_stats 中不仅有索引,还有更多对象 - 例如堆(没有聚集索引的表)也在那里。

    尝试在 sys.indexes 上进行内部连接以将自己限制在索引中。

    【讨论】:

    • 抱歉,我没有提到...是的,我通过在 object_ids 上加入 sys.indexes 来获取索引。
    【解决方案3】:

    您想了解的有关 SQL 碎片以及如何处理它的所有信息都可以在 SQLFool 找到

    她有一个用于自动进行索引碎片整理的出色脚本,如果您有任何问题,她会非常有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      相关资源
      最近更新 更多