重新组织碎片整理的索引和级别

时间:2012-09-13 11:14:05

标签: sql sql-server sql-server-2008 indexing reorganize

我发现了这个问题here但尚无答案:

如果索引严重碎片化(超过50%),alter index reorganize会降低碎片级别吗?

2 个答案:

答案 0 :(得分:1)

是的,它会 - 但只是在某种程度上。索引重组只会在索引的叶级页面周围进行混洗,并会尝试压缩它们 - 但它不会完全重建索​​引结构。所以它可以消除一些碎片 - 但只能在有限的范围内。

这就是为什么根据经验,碎片大于30%(或者你可能想要选择不同的阈值,如25%,取决于你的位置),你应该重建 index - 不仅仅是reindex。重建还会更新对良好查询计划至关重要的统计信息。

答案 1 :(得分:1)

这取决于是否存在的碎片的性质。

重新组织不会分配新页面,因此无法删除由于不连续的扩展区而发生的碎片。它通过交换页面来工作。即它确定属于叶级别的第一个物理页面和叶级别中的第一个逻辑页面,如果它们不同则交换内容。

如果我尝试以下操作,我会看到重组会将碎片从99.9%降低到0.9%

CREATE TABLE T( [ID] [int] IDENTITY NOT NULL,
                 [Filler] [char](8000) NULL,
                 PRIMARY KEY CLUSTERED ([ID] DESC))

GO

INSERT INTO T DEFAULT VALUES
GO 1000

SELECT object_name(object_id) AS name, 
       page_count, 
       avg_fragmentation_in_percent, 
       fragment_count, 
       avg_fragment_size_in_pages 
FROM 
sys.dm_db_index_physical_stats(db_id(), object_id('T'), 1, NULL, 'DETAILED') 
WHERE  index_level = 0 


SET STATISTICS IO ON;
ALTER INDEX ALL ON T
REORGANIZE ; 

SELECT object_name(object_id) AS name, 
       page_count, 
       avg_fragmentation_in_percent, 
       fragment_count, 
       avg_fragment_size_in_pages 
FROM 
sys.dm_db_index_physical_stats(db_id(), object_id('T'), 1, NULL, 'DETAILED') 
WHERE  index_level = 0