首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

重建索引消除碎片,大幅提升 SQL Server 效能完整指南

     編輯:關於SqlServer

為什麼索引需要持續維護?

索引儲存架構與碎片成因

  • 資料頁 (8KB):SQL Server 以 8KB 頁面儲存資料。無索引時為 Heap(無序堆疊)。
  • 叢集索引:實際重新排序資料列(雙向鏈結列表),葉層即資料頁。插入導致頁面分裂,邏輯順序與物理順序偏離 → 邏輯掃描碎片。
  • 非叢集索引:葉層為索引鍵 + 書籤(叢集鍵或 RID)。叢集索引分裂會導致非叢集索引書籤失效,間接產生碎片。
  • Extent(擴展區,64KB/8頁):跨 Extent 配置造成 Extent 掃描碎片。

DBCC SHOWCONTIG:碎片診斷金標準

關鍵指標解讀

指標含義健康閾值
Scan Density [Best:Actual]最佳/實際 Extent 切換次數比≥ 95% (100% 為無碎片)
Logical Scan Fragmentation索引頁邏輯順序偏離百分比≤ 10%(叢集索引更嚴格)
Extent Scan Fragmentation非連續 Extent 百分比參考值,視磁碟子系統而定
Avg. Page Density (full)頁面填滿度依 Fill Factor 而定,通常 80-95%

實戰範例

USE Northwind;
DECLARE @table_id INT = OBJECT_ID('Orders');
DBCC SHOWCONTIG(@table_id);

輸出 Scan Density 100% [3:3]、Logical Scan Fragmentation 0% 表示索引極佳;若 Best:Actual = 3:5 則需重建。

重建 vs 整理:DBCC DBREINDEX vs DBCC INDEXDEFRAG

特性DBCC DBREINDEXDBCC INDEXDEFRAG (SQL 2000) / ALTER INDEX REORGANIZE (2005+)
操作模式離線(鎖定資料表,Schema 修改鎖)線上(不阻塞查詢/修改)
碎片清除徹底度完全重建,碎片歸零,可調整 Fill Factor就地整理,碎片降低但不歸零
記錄檔空間大(完整重建)小(分批提交)
統計資料更新自動更新(掃描全表)不更新,需另行 UPDATE STATISTICS
適用場景維護窗口、碎片嚴重 (>30%)、需調整 Fill Factor7x24 無維護窗口、碎片輕微 (10-30%)

DBREINDEX 實戰

-- 重建指定叢集索引,Fill Factor 90%
DBCC DBREINDEX('Northwind.dbo.Orders', 'PK_Orders', 90);

-- 重建所有索引
DBCC DBREINDEX('Northwind.dbo.Orders', '', 90);

SQL 2005+ 推薦語法:

ALTER INDEX ALL ON dbo.Orders REBUILD WITH (FILLFACTOR = 90, ONLINE = ON); -- Enterprise 版支援 ONLINE
ALTER INDEX IX_Orders_CustID ON dbo.Orders REORGANIZE;

自動化維護策略

  1. 資料庫維護計畫:排程 重建索引 / 重新組織索引 / 更新統計資料 任務。
  2. 智慧型腳本 (Ola Hallengren / Minion Reindex):依碎片閾值動態決定 REBUILD/REORGANIZE,支援排除唯讀/大型資料表。
  3. 監控指標:sys.dm_db_index_physical_stats (2005+) 定期掃描,碎片 > 30% 觸發重建。

Fill Factor 設定指引

  • 高插入/更新、鍵值遞增:Fill Factor 80-90%,預留空間減少分裂。
  • 唯讀/極少修改:Fill Factor 100%(或 0),最大化頁面密度。
  • GUID/隨機鍵值:Fill Factor 70-80%,因插入位置隨機,分裂頻繁。

結語

索引碎片是 SQL Server 效能隱形殺手。建立 「診斷 → 閾值判斷 → 選擇 REBUILD/REORGANIZE → 驗證」 閉環流程,配合適當 Fill Factor 與自動化排程,能持續保持索引健康,讓查詢計畫穩定高效運行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved