SQL Server 2005索引碎片

时间:2009-11-17 16:26:08

标签: sql sql-server sql-server-2005 performance fragmentation

我继承的SQL Server 2005数据库中的几个键具有非常高的碎片百分比。使用以下SQL时:

select  OBJECT_NAME(object_id), avg_fragmentation_in_percent, record_count, *
from    sys.dm_db_index_physical_stats (DB_ID(N'FragmentedDB'), NULL, NULL, NULL, 'Detailed') s

我看到几个表碎片%在50到99之间。这些表都有超过100,000行,有些表有2,000,000+。我相信这会给我们的应用程序带来严重的性能问题,所以我尝试使用以下sql重建其中一些索引:

ALTER INDEX ALL ON [dbo].[FragmentedTable] 
REBUILD WITH ( FILLFACTOR = 90, ONLINE = ON )

然而,在我重建索引并再次查看碎片%之后,它们都没有改变。有什么我想念的吗?我已经对这个主题进行了一些搜索,但到目前为止已经空了。

谢谢!

5 个答案:

答案 0 :(得分:1)

这是一篇关于这个主题的好文章。

Index Fragmentation Anxiety: a Doctor Speaks

答案 1 :(得分:1)

您正在使用dm_db_index_physical_stats的“详细信息”。这将显示非叶级别以及索引的叶级别。

叶级别(leaf_level = 0),非叶级别(leaf_level> 0)或两者都是碎片?

如果碎片处于非叶级别,这不是问题,也不是问题。

如果您仍想摆脱所有碎片,请尝试添加PAD_INDEX。

答案 2 :(得分:0)

首先想到的是 - 首先是如果您使用多个文件来支持表中的索引,接下来将是您在重建索引时看到的并行性。接下来,你提到你相信这会导致性能问题,你验证过这种情况吗?即,除了一些例外,对于扫描与搜索,碎片通常是更大的问题。有关碎片,如何解决,集中注意力以及您使用不同修复方法看到的差异的详细审查,请参阅this series of blog posts

答案 3 :(得分:0)

思想..

  • 分区了吗? REBUILD PARTITION = partition_number
  • 需要LOB_COMPACTION = ON
  • 你有聚集索引吗?

答案 4 :(得分:0)

有两种方法可以删除碎片。这两种方法是必要的,因为它们具有完全不同的特征。

描述SQL Server 2005之后的三种方法之间的差异:

ALTER INDEX ... REORGANIZE(新的DBCC INDEXDEFRAG)

ALTER INDEX ... REBUILD(新的DBCC DBREINDEX)

ALTER INDEX ... REBUILD

了解更多信息
http://sqlnetcode.blogspot.com/2011/11/sql-server-methods-for-removing.html