web-dev-qa-db-ja.com

IDの主キーインデックスはどのようにして断片化することができますか?

インデックスの断片化について私が理解していることから、これは不可能であるべきです。私のデータベースで見つけたケースは、クラスター化されていません。

例:

ALTER TABLE [dbo].[ClaimLineInstitutional] ADD  CONSTRAINT [PK_ClaimLineInsitutional]  
PRIMARY KEY NONCLUSTERED 
(
    [ClaimLineInstitutionalID] ASC
)WITH (PAD_INDEX  = ON, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF,   
IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON,    
FILLFACTOR = 100) ON [PRIMARY]

更新:

私はdm_db_index_physical_stats.avg_fragmentation_in_percentにクエリを実行しているので、私が目にしているのは物理的な断片化だと思います。

4
Keith Walton

すでにそこにあるデータを更新すると、行が移動し、前方ポインタが追加されます

このテストでは、115kの密にパックされた行で65%の断片化を取得できます。

CREATE TABLE #FragTest (
    FragTestID int NOT NULL IDENTITY PRIMARY KEY,
    SomeString varchar(4100) NULL
    );

INSERT #FragTest (SomeString) VALUES ('a');
GO
INSERT #FragTest (SomeString)
    SELECT F1.SomeString FROM #FragTest F1 CROSS JOIN #FragTest F2;
GO 4
INSERT #FragTest (SomeString) SELECT F1.SomeString FROM #FragTest F1    
GO 6

SELECT COUNT(*) FROM #FragTest

SELECT object_id, avg_fragmentation_in_percent, page_count
FROM sys.dm_db_index_physical_stats(2, OBJECT_ID('tempdb..#FragTest'), NULL, NULL, NULL);

UPDATE #FragTest
SET SomeString = REPLICATE('b', 4100)
WHERE FragTestID < 10000 AND FragTestID % 3 = 0

SELECT object_id, avg_fragmentation_in_percent, page_count
FROM sys.dm_db_index_physical_stats(2, OBJECT_ID('tempdb..#FragTest'), NULL, NULL, NULL);

UPDATE #FragTest
SET SomeString = REPLICATE('c', 4100)
WHERE FragTestID < 10000 AND FragTestID % 3 = 1

SELECT object_id, avg_fragmentation_in_percent, page_count
FROM sys.dm_db_index_physical_stats(2, OBJECT_ID('tempdb..#FragTest'), NULL, NULL, NULL);

UPDATE #FragTest
SET SomeString = REPLICATE('d', 4100)
WHERE FragTestID < 10000 AND FragTestID % 3 = 2

SELECT object_id, avg_fragmentation_in_percent, page_count
FROM sys.dm_db_index_physical_stats(2, OBJECT_ID('tempdb..#FragTest'), NULL, NULL, NULL);

編集、申し訳ありませんが、ブラウザの問題

中間の複製を2000に変更すると、最後に5%未満になります。これは、最初の更新で移動された行からの空き領域があるために発生します

8
gbn

論理的な断片化は、論理的に次のページが物理的に次のページと異なる場合に発生します。

単調に増加するキーを持つインデックスのリーフレベルの場合、これは、インデックスのエクステント割り当てが他のオブジェクトのエクステント割り当てとインターリーブされる場合に発生する可能性があります。

これがなくても、異なるエクステントレベルの混合エクステントとページからの最初のページ割り当てが同じエクステントにインターリーブされるため、少量の断片化が発生します。

(編集:もちろん、@ gbnの回答による更新とページ分割の効果)

4
Martin Smith