私はここでこの質問を見つけましたが、まだ答えはありません:
インデックスが大幅に断片化されている場合(50%以上)alter index reorganize
、断片化のレベルは低下しますか?
私はここでこの質問を見つけましたが、まだ答えはありません:
インデックスが大幅に断片化されている場合(50%以上)alter index reorganize
、断片化のレベルは低下しますか?
はい、そうなりますが、ある程度までです。インデックスの再編成は、インデックスのリーフ レベルのページのみをシャッフルし、それらを圧縮しようとしますが、インデックス構造を完全に再構築するわけではありません。そのため、ある程度の断片化を解消できますが、規模は限られています。
そのため、経験則として、断片化が約 30% を超える場合 (または、状況に応じて 25% などの別のしきい値を選択することもできます)、インデックスを再構築するだけでなく、インデックスを再構築する必要があります。Rebuild は、適切なクエリ プランに不可欠な統計も更新します。
それが可能かどうかは、断片化の性質に依存します。
再編成では新しいページが割り当てられないため、エクステントが連続していないために発生する断片化を取り除くことはできません。ページを交換することで機能します。つまり、リーフ レベルに属する最初の物理ページとリーフ レベルの最初の論理ページを特定し、それらが異なる場合は内容を交換します。
以下を試すと、再編成により断片化が 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