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

SQL Server 索引建立完整指南:類型選擇、語法範本、填充因子與優缺點權衡

     編輯:關於SqlServer

索引核心概念

資料以 8 KB 頁面儲存;索引是有序的指標結構,讓引擎透過 B+ 樹快速定位資料頁,避免全表掃描。好比漢語字典的拼音/筆劃/部首檢字表,根據不同排序滿足不同查詢路徑。

四大索引類型對比

類型定義限制典型用途
唯一索引鍵值不可重複,允許單一 NULL資料已有重複值則無法建立業務鍵(身分證、Email、帳號)
主鍵索引唯一索引特例,不可為 NULL,預設為叢集索引每表僅一個實體識別欄(ID、Sno)
叢集索引資料頁物理順序 = 索引邏輯順序,每表僅一個寬鍵值導致非叢集索引膨脹範圍查詢頻繁、排序固定的欄位(建立日期、流水號)
非叢集索引邏輯順序與物理順序分離,葉層存行定位器(RID 或叢集鍵),每表 ≤ 999 個書籤查找開銷大高選擇性點查、JOIN/WHERE 條件欄位、覆蓋索引

叢集 vs 非叢集:字典比喻深度解析

  • 叢集索引 = 拼音排序字典本體:拼音順序即頁碼順序,查「hao」直接翻到對應頁,資料即索引。
  • 非叢集索引 = 筆劃/部首檢字表:檢字表順序與正文頁碼無關,查到字後再翻頁碼,索引指向資料。
  • 建立主鍵時,SQL Server 預設建立叢集索引;若主鍵非叢集,需顯式指定 NONCLUSTERED。

CREATE INDEX 語法全樣板

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX index_name
ON schema.table (column_name [ASC | DESC] [, ...n])
[INCLUDE (column_name [, ...n])]          -- 覆蓋索引:非鍵欄位僅存葉層
[WHERE ]                -- 篩選索引(SQL 2008+)
[WITH (
    FILLFACTOR = 80,                       -- 頁面填滿百分比,預留分頁空間
    PAD_INDEX = ON,                        -- 中繼層也套用 FILLFACTOR
    SORT_IN_TEMPDB = ON,                   -- 排序暫存放 tempdb,減少用戶資料庫記錄
    ONLINE = ON,                           -- Enterprise 版:建立過程不鎖表
    DATA_COMPRESSION = PAGE                -- 頁面壓縮節省空間
)];
GO

實戰範例:為 stuMarks.writtenExam 建非叢集索引

索引優缺點權衡表

優點缺點
  • 大幅加速 SELECT/WHERE/JOIN/ORDER BY
  • 強制唯一性(唯一/主鍵索引)
  • 支援覆蓋索引,消除書籤查找
  • 佔用額外儲存空間(約資料表 10%-300%)
  • INSERT/UPDATE/DELETE 需同步維護索引,增加 CPU/IO/記錄
  • 過多索引導致優化器評估時間變長、計劃不穩定

建立索引決策檢查清單

  1. 高頻查詢欄位: 出現在 WHERE、JOIN、ORDER BY、GROUP BY 的欄位優先。
  2. 高選擇性: 不同值數量 / 總行數 > 90%(如身分證、手機號);低選擇性(性別、狀態碼)單列索引效果差,考慮複合索引或篩選索引。
  3. 小表慎建: < 1,000 行或 < 100 頁,全表掃描比索引查找更快。
  4. 寬欄位慎建叢集: 叢集鍵會複製到所有非叢集索引葉層,建議用窄、遞增、不變的欄位(如 INT IDENTITY)。
  5. 定期維護: sys.dm_db_index_physical_stats 檢測碎片 > 30% → REBUILD;10%-30% → REORGANIZE;同步更新統計資料。

進階主題速覽

  • 篩選索引: WHERE status = 1 只索引作用中列,大幅縮小體積。
  • 欄存儲索引: SQL 2012+ 針對資料倉儲掃描優化,壓縮率高、批次模式處理。
  • 記憶體優化索引: Hekaton 內存表專用雜湊/範圍索引,無鎖無閂鎖。

索引是資料庫效能的杠桿,用得好撬起千鈞查詢,用不好拖垮寫入吞吐。遵循「測量→建立→驗證→維護」閉環,方能長治久安。

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