SQL Server 以 8KB 頁面儲存資料。叢集索引實際重排資料順序 (如字典目錄),非叢集索引儲存指標。插入資料導致頁面分裂,邏輯順序與物理順序脫節形成**碎片**,降低掃描效率。
USE Northwind
DECLARE @table_id INT
SET @table_id = OBJECT_ID('Orders')
DBCC SHOWCONTIG(@table_id)
| 指標 | 健康門檻 | 說明 |
|---|---|---|
| Scan Density | 100% 最佳 | Best Count:Actual Count,<100% 表示碎片 |
| Logical Scan Fragmentation | 接近 0% | 索引頁邏輯順序亂序比例 |
| Extent Scan Fragmentation | 越低越好 | 區塊層級碎片 |
| Avg. Page Density | 視填充因子 | 頁面飽滿度,過低表示空間浪費 |
| 指標 | 重建前 | 重建後 (PK_Orders, Fillfactor=90) |
|---|---|---|
| Scan Density | 60% [3:5] | 100% [3:3] ✓ |
| Logical Fragmentation | 0% | 0% |
| Extent Fragmentation | 40% | 33.33% |
| Avg. Bytes Free/Page | 146.5 | 869.2 |
| Page Density | 98.19% | 89.26% |
-- 重建指定叢集索引
DBCC DBREINDEX('Northwind.dbo.Orders', 'PK_Orders', 90)
-- 重建所有索引
DBCC DBREINDEX('Northwind.dbo.Orders', '', 90)
參數:資料表名、索引名 (空白=全部)、填充因子 (0-100,越大頁面越滿)
DBCC SHOWCONTIG 結果,僅當 Scan Density < 90% 或 Fragmentation > 30% 時重建DBCC INDEXDEFRAG / ALTER INDEX REORGANIZE (2005+) 線上整理,無鎖定FILLFACTOR = 100 (或 0)70-80 預留空間減少分裂90-100 分裂僅發生尾端下一篇將涵蓋:查詢計劃分析、統計資料更新、參數嗅探問題、覆蓋索引設計。