我继承的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 )
然而,在我重建索引并再次查看碎片%之后,它们都没有改变。有什么我想念的吗?我已经对这个主题进行了一些搜索,但到目前为止已经空了。
谢谢!
答案 0 :(得分:1)
这是一篇关于这个主题的好文章。
答案 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