アイデンティティのプライマリキーインデックスはどのようにして断片化できますか?
-
16-10-2019 - |
質問
私がインデックスの断片化について理解していることから、これは不可能です。データベースで見つけたケースはクラスター化されていません。
例:
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_PERENTをクエリしているので、私が見ている物理的な断片化だと思います。
解決
既にそこにデータの更新により、行が移動され、前方のポインターが追加されます
このテストでは、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%未満になります。これは、最初のアップデートで移動する行からの空きスペースがあるために起こります
他のヒント
論理的な断片化は、論理的に次のページが物理的に次のページと異なる場合に発生します。
単調に増加するキーを備えたインデックスの葉レベルの場合、これは、インデックスの範囲が他のオブジェクトの割り当てと範囲がインターリーブされる場合に発生する可能性があります。
これがなくても、同じ範囲でインターリーブされているさまざまなインデックスレベルの混合範囲とページからの最初のページの割り当てにより、少量の断片化が続きます。
(編集:もちろん、 @GBNの回答に従って更新とページの分割の効果)
所属していません dba.stackexchange