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

使用 SQL 建立索引完整指南:叢集與非叢集、屬性、語法與管理工具

     編輯:關於SqlServer

索引概念:書本目錄類比

  • **叢集索引** = 書本**目錄頁碼順序與實際內容順序一致**,一本書只能有一種實體排列順序 → **一個表只能有一個叢集索引**。
  • **非叢集索引** = 書本**後方主題/作者索引**,邏輯順序與實體順序無關,可建立多個 → **最多 249 個非叢集索引** (SQL 2008+ 可達 999)。

叢集 vs 非叢集 選擇指南

場景建議索引類型理由
主鍵/身分證號/流水號 (唯一、遞增)叢集索引資料物理順序 = 邏輯順序,範圍查詢極快,無書籤查找
頻繁範圍查詢 (日期區間、金額區間)叢集索引葉層資料連續,掃描效率高
高選擇性點查詢 (姓名、信箱、代碼)非叢集索引Seek 定位快,配合 INCLUDE 可覆蓋查詢
多種查詢模式並存叢集 + 多個非叢集叢集支援範圍/排序,非叢集支援點查/覆蓋
極高頻寫入 (INSERT/UPDATE/DELETE)少建非叢集索引每個非叢集索引皆需維護,寫入開銷大

索引屬性

  • 複合索引 (Composite Index):多欄位組合,順序關鍵 (最高選擇性/最常用篩選欄位在前)。最多 16 欄位 (SQL 2008+ 32)。
  • 唯一索引 (Unique Index):強制欄位值唯一,主鍵預設建立唯一叢集索引;可對非主鍵欄位建立 (如 Email、身分證號)。

SQL 建立索引語法 (CREATE INDEX)

基本非叢集、非唯一索引 (預設)

CREATE INDEX IX_Table_Column ON TableName (ColumnName);

執行成功訊息:「This command did not return data, and it did not return any rows」。

刪除索引

DROP INDEX TableName.IndexName;

⚠ 必須指定 **表名.索引名**。

叢集索引

CREATE CLUSTERED INDEX IX_Table_Col_Clustered ON TableName (ColumnName);
  • 資料表有重複值時會報錯;需加 WITH ALLOW_DUP_ROW (舊版) 或改建非唯一叢集索引 (新版預設允許重複,但需指定 UNIQUE 才強制唯一)。

允許重複值的叢集索引 (舊版語法)

CREATE CLUSTERED INDEX IX_Table_Col ON TableName (ColumnName) WITH ALLOW_DUP_ROW;

唯一叢集索引 (常用於主鍵)

CREATE UNIQUE CLUSTERED INDEX IX_Table_PK ON TableName (ColumnName);

✅ 最推薦模式:主鍵 + 唯一 + 叢集,查詢效能最佳。

複合索引 (多欄位)

CREATE INDEX IX_User_Name ON Users (LastName, FirstName);
  • 適用於 **同時** 依多欄位篩選/排序/群組的查詢。
  • 若需 **分別** 查詢單一欄位,應建立 **獨立單欄索引**。

企業管理員圖形化建立索引

方法一:管理資料表視窗 (建立主索引/主鍵)

  1. 點選「進階選項」 (表格圖示帶 + 號)。
  2. 「主索引鍵」區塊 → 下拉選單勾選欄位 (可多選建立複合主鍵)。
  3. 選擇叢集/非叢集 → 儲存表 → 自動建立索引,欄位旁顯示鑰匙圖示。
  4. ⚠ 主索引鍵限制:欄位不可為 NULL、強制唯一。

方法二:管理索引視窗 (建立一般索引)

  1. 選單「管理」→「索引」開啟視窗。
  2. 「索引」下拉選單選「新增索引」。
  3. 勾選欄位 → 「加入」 → 設定選項:叢集/非叢集、唯一/非唯一、填充因子等。
  4. 點選「建立」完成。

注意事項與最佳實務

  1. 唯一索引 ≠ 唯一索引數量限制:意指「欄位值不可重複」,非「只能建一個索引」。
  2. 填充因子:高寫入表設定 70-80% 減少頁分裂;唯讀/低寫入表 90-100% 提高密度。
  3. 統計資料:索引建立後自動建立統計資料;大量資料異動後執行 UPDATE STATISTICS 或啟用自動更新。
  4. 覆蓋索引:使用 INCLUDE (SQL 2005+) 將非鍵值欄位加入葉層,避免 Key Lookup,大幅提升查詢速度。
  5. 定期維護:重建/重組索引 (ALTER INDEX ... REBUILD/REORGANIZE) 消除碎片,更新統計資料。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved