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

SQL Server 索引優化實戰:類型選擇、填充因子、碎片整理與維護計畫

     編輯:關於SqlServer

索引類型選擇決策樹

場景推薦索引理由
高選擇性、範圍查詢、順序存取、外鍵關聯叢集索引資料實際排序,範圍掃描極快,每表僅一個
低選擇性、精確查詢、多條件組合、覆蓋索引需求非叢集索引最多 249 個,葉層含書籤指向資料
主鍵 (PK)預設建立**唯一叢集索引**強制唯一 + 排序;可改為非叢集若有更適合叢集的欄位
外鍵 (FK) 高頻 JOIN非叢集索引加速 JOIN、避免 Table Scan

資料頁、填充因子與頁面分裂

  • 資料頁 (8KB):索引建立時依 Fill Factor 預留空間。
  • Fill Factor (0-100%)**:0 = 100% (預設)。頁面填滿觸發**頁面分裂** → 邏輯/物理順序偏離 → 碎片 → 效能下降。
  • 動態調整不可行:Fill Factor 僅在建立/重建時生效,需重建索引才能變更。

Fill Factor 設定指引

工作負載特徵建議 Fill Factor說明
唯讀/極少修改、遞增鍵 (Identity/日期)100% (0)最大化密度,無分裂風險
高頻 INSERT/UPDATE、遞增鍵90-95%預留少量空間吸收尾部插入
高頻修改、隨機鍵 (GUID/雜湊)70-85%大幅預留空間減少隨機位置分裂
大量批次匯入後轉唯讀100% → 匯入後 REBUILD 100%匯入時無索引/低 Fill Factor,匯入後重建

碎片整理:DBCC INDEXDEFRAG vs DBREINDEX (SQL 2000) / REORGANIZE vs REBUILD (2005+)

指標REORGANIZE / INDEXDEFRAGREBUILD / DBREINDEX
線上/離線線上 (無鎖)離線 (Sch-M 鎖) / Enterprise 版支援 ONLINE=ON
碎片清除徹底度部分 (葉層重排)完全 (重建 B-Tree)
統計資料更新否是 (全掃描)
記錄檔空間小 (分批)大 (完整重建)
適用碎片閾值10-30%> 30%

智慧型維護腳本邏輯 (Ola Hallengren 風格)

IF fragmentation > 30%      → ALTER INDEX ... REBUILD WITH (FILLFACTOR = ..., ONLINE = ON)
ELSE IF fragmentation > 10% → ALTER INDEX ... REORGANIZE
ELSE                         → SKIP

-- 完成後若 REORGANIZE 或 SKIP 且統計資料過舊 → UPDATE STATISTICS ... WITH FULLSCAN

統計資料:查詢優化器的眼睛

  • DBCC SHOW_STATISTICS / sys.dm_db_stats_properties 檢查 rows, rows_sampled, modification_counter
  • 自動更新觸發條件:資料列變更 > 20% + 500 (SQL 2008R2 SP1+ 引入動態閾值)
  • 手動更新:UPDATE STATISTICS dbo.TableName INDEX_Name WITH FULLSCAN (重要索引) / SAMPLE (大表)
  • 非同步更新:AUTO_UPDATE_STATISTICS_ASYNC ON 避免查詢等待統計更新

資料庫維護計畫 (DMPW) 自動化

  1. EM → 管理 → **資料庫維護計畫** → 嚮導建立
  2. 核心任務勾選:
    ☑ **重新組織資料與資料頁** (REORGANIZE + 更新統計)
    ☑ **重建索引** (可指定 Fill Factor、排程)
    ☑ **更新統計資料** (獨立排程,高頻)
    ☑ **檢查資料庫完整性** (DBCC CHECKDB)
    ☑ **備份資料庫/記錄檔**
  3. 輸出為 **SQL Server Agent 作業**,可進階編輯步驟、通知、排程

結語

索引優化非一次性動作,而是 **「選擇正確類型 → 設定合適 Fill Factor → 監控碎片/統計 → 自動化 REORGANIZE/REBUILD/UPDATE STATS」** 的持續週期。掌握決策矩陣、閾值與自動化工具,讓索引持續保持「優化器最愛」的健康狀態。

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