重建大型SQL索引不会更改碎片百分比

时间:2009-08-13 20:05:14

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

我在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之前和之后报告完全相同的碎片级别。

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

3 个答案:

答案 0 :(得分:2)

您可能需要检查索引的FILLFACTOR参数 - 这会对您的索引碎片产生很大影响。

在包含大量插入,更新,删除的“繁忙”索引中,通常应该使用70%到90%之间的填充因子 - 具体取决于您拥有的varchar()字段数。

在一个不断增加的索引(特别是聚簇索引)上(通常是INT IDENTITY),你可以使用FILLFACTOR 0(或100 - 两者都是相同的),你只会看到删除碎片。

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

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

以下是有关fillfactors及其对性能影响的更多信息:

希望这有点帮助!

马克

答案 1 :(得分:1)

您可能希望了解有关SQL碎片以及如何处理它的所有内容,请访问SQLFool

她有一个用于自动化索引碎片整理的神奇脚本,如果您有疑问,它会非常有用。

答案 2 :(得分:0)

您确定要获得索引的碎片吗? sys.dm_db_index_physical_stats中有多个对象而不仅仅是索引 - 例如堆(没有聚簇索引的表)也在那里。

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