索引碎片會嚴重拖慢查詢效能。本文解析索引 B-tree 結構、分頁分裂成因,並示範如何用 DBCC SHOWCONTIG 量化碎片程度,決定是否執行 DBCC DBREINDEX 重建索引。
SQL Server 以 8KB 頁面儲存資料。叢集索引將資料依鍵值排序,形成雙向鏈結清單。插入資料導致頁面滿載時發生分頁分裂,約一半資料移至新頁,邏輯順序與物理順序不再一致,產生邏輯碎片。非叢集索引指向叢集索引鍵,同樣受碎片影響。
以 Employee 資料表為例:
USE database_name;
DECLARE @table_id INT = OBJECT_ID('Employee');
DBCC SHOWCONTIG(@table_id);
關鍵輸出指標:
範例輸出顯示 Logical Scan Fragmentation 0.56%、Scan Density 92%,屬輕度碎片,可考慮線上索引重組 (ALTER INDEX ... REORGANIZE) 而非離線重建。
重建會重新建立索引 B-tree,消除碎片、更新統計資料、壓縮頁面。語法:
DBCC DBREINDEX ('Employee', '', 90); -- 90% fillfactor
注意:重建期間鎖定資料表 (企業版可指定 ONLINE=ON),應安排在維護時段。SQL Server 2005+ 建議改用 ALTER INDEX ... REBUILD,功能更完整且支援線上操作。