2009-11-17 99 views
1

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

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。这些表之间的分裂%,都超过10万行,有的用2,000,000+。我相信这是造成显著的性能问题,为我们的应用程序,所以我试图重建一些指标的用下面的SQL:

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

然而,当我重建索引,并在破碎%再看看,他们都保持不变。有什么我失踪?我已经对这个主题进行了一些搜索,但到目前为止已经空了。

谢谢!

+0

我也得到了同样的事情发生。但是,当我使用Sql Management Studio检查碎片(使用索引属性)时,它显示0.24%碎片的正确值。当我使用上面的方法时,它告诉我它是100%碎片。 – Kelly 2012-06-07 16:53:19

+0

你有没有重组索引? – 2009-11-17 16:29:10

+0

是的,我也跑了: ALTER INDEX ALL ON [dbo]。[FragmentedTable] REORGANIZE – Blather 2009-11-17 16:31:13

回答

0

想起了几件事 - 首先是如果您使用多个文件来备份表中的索引,那么接下来将是重建索引时看到的并行性。接下来,你提你相信这是造成性能问题,你是否证实了这种情况?即有一些例外,对于扫描与寻找来说,碎片通常是更大的问题。有关碎片的详细综述,如何解决,集中在哪里以及使用不同的修复方法看到的差异,请参见this series of blog posts

0

思考..

  • 难道是分区? REBUILD PARTITION = partition_number
  • 需要LOB_COMPACTION = ON
  • 你有聚集索引吗?
+0

这时它不是分区。 我用LOB_COMPACTION = ON重新执行了我的查询,没有任何更改。 我的群集和非群集索引都遭受了我描述的碎片问题。 感谢您的回复! – Blather 2009-11-17 16:49:25

1

您正在使用 '详细' 与dm_db_index_physical_stats。这将显示非叶级别以及索引的叶级别。

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

如果碎片处于非叶级别,这不是一个问题,或没有问题。

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

0

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

介绍在SQL Server 2005以后的三种方法之间的区别:

ALTER INDEX ...重组​​(新DBCC INDEXDEFRAG)

ALTER INDEX ... REBUILD(新DBCC DBREINDEX)

ALTER INDEX ... REBUILD

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

+0

链接不再有效 – 2013-02-20 11:46:47