我在这里找到了这个问题,但还没有答案:
如果索引碎片严重(超过 50%),是否会alter index reorganize
降低碎片级别?
我在这里找到了这个问题,但还没有答案:
如果索引碎片严重(超过 50%),是否会alter index reorganize
降低碎片级别?
是的,它会——但只是在一定程度上。索引重组只会围绕索引的叶级页面进行洗牌,并会尝试压缩这些页面 - 但它不会完全重建索引结构。所以它可以消除一些碎片——但只能在有限的范围内。
这就是为什么根据经验,对于大于约 30% 的碎片(或者您可能想要选择不同的阈值,例如 25%,具体取决于您的情况),您应该重建索引 - 而不仅仅是重新索引。Rebuild 还会更新对良好查询计划至关重要的统计信息。
它是否会取决于碎片的性质。
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