0

我在这里找到了这个问题,但还没有答案:

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

4

2 回答 2

1

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

这就是为什么根据经验,对于大于约 30% 的碎片(或者您可能想要选择不同的阈值,例如 25%,具体取决于您的情况),您应该重建索引 - 而不仅仅是重新索引。Rebuild 还会更新对良好查询计划至关重要的统计信息。

于 2012-09-13T12:09:39.960 回答
1

它是否会取决于碎片的性质。

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

如果我尝试以下操作,我会看到重组将碎片从 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 
于 2012-09-13T12:26:15.940 回答