我在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之前和之后报告完全相同的碎片级别。
这些信息是缓存的,还是我做错了什么?
答案 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上进行内部连接,将自己限制为索引。