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

SQL 資料操作進階 (七):索引建立完整指南 — T-SQL 與 Enterprise Manager 雙軌實作

     編輯:關於SqlServer

索引是提升查詢效能的關鍵。本文詳細說明透過 T-SQL 指令與 Enterprise Manager 圖形介面建立各類索引:叢集/非叢集、唯一/非唯一、單欄/複合、允許重複列的叢集索引,並解析各選項意義。

為何需要索引?

類比書本索引:無索引逐頁翻閱 (全表掃描) vs 有索引直接定位頁碼 (索引搜尋)。大表查詢從數小時縮減至分鐘。

空間成本提醒

  • 叢集索引約需 1.2x 資料大小空間
  • 非叢集索引額外佔用儲存與記憶體
  • 空間不足時需權衡,可用 sp_spaceused 'table_name' 查看索引佔用

索引類型核心差異

類型葉層內容資料物理順序每表上限查詢優勢
叢集索引實際資料列與索引順序一致1 個範圍查詢、排序、大量資料存取極快
非叢集索引指向資料列的書籤與索引順序無關249 個精確點查詢、覆蓋索引

叢集索引 = 目錄頁 (順序 = 實際頁碼)

非叢集索引 = 書末索引 (順序 ≠ 實際頁碼)

T-SQL 建立索引完整語法

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

CREATE INDEX mycolumn_index ON mytable (mycolumn);

命名建議:IX_表名_欄位名 或 IDX_表名_欄位名,包含欄位名利於維護識別。

刪除索引

DROP INDEX mytable.mycolumn_index;

必須包含表名,因索引名稱僅在表內唯一。

叢集索引

CREATE CLUSTERED INDEX mycolumn_clust_idx ON mytable (mycolumn);

表有重複列時會報錯。需允許重複:

CREATE CLUSTERED INDEX mycolumn_cidx ON mytable (mycolumn)
WITH ALLOW_DUP_ROW;

唯一索引 (叢集/非叢集均可)

-- 唯一叢集索引 (最常用、效能最佳)
CREATE UNIQUE CLUSTERED INDEX mycol_cidx ON mytable (mycolumn);

-- 唯一非叢集索引
CREATE UNIQUE NONCLUSTERED INDEX mycol_ncidx ON mytable (mycolumn);

最佳實務:盡可能建立唯一叢集索引 (通常加在主鍵/識別欄位),大幅強化查詢。

複合索引 (最多 16 欄位)

CREATE INDEX name_idx ON username (firstname, lastname);

關鍵差異:複合索引 = 單一索引覆蓋多欄位 (適合同時查詢多欄位);多個單欄索引 = 分別索引 (適合分別查詢各欄位)。

Enterprise Manager 圖形化建立索引

途徑 1:Manage Tables 視窗 (建立主索引/主鍵)

  1. 右鍵資料表 → Design Table / Manage Tables
  2. 點選 Advanced Options (加號圖示)
  3. Primary Key 區塊:下拉選擇欄位 (可多選建立複合主鍵)
  4. 選擇叢集/非叢集
  5. 儲存 → 自動建立索引,欄位旁顯示鑰匙圖示

限制:主索引欄位不允許 NULL、強制唯一。

途徑 2:Manage Indexes 視窗 (建立一般索引)

  1. 選單 Manage → Indexes
  2. Index 下拉選 New Index
  3. 選擇欄位 → Add 加入索引 (可多欄位建立複合)
  4. 選項設定:
    • Clustered / Non-clustered
    • Unique / Non-unique
    • Allow Duplicate Rows (僅叢集)
    • Fill Factor、Pad Index、Sort in TempDB 等進階選項
  5. 點選 Build 建立

索引屬性總覽

屬性叢集非叢集說明
複合索引 (多欄位)支援支援最多 16 欄位
唯一約束支援支援欄位值不可重複
允許重複列WITH ALLOW_DUP_ROW預設允許叢集索引預設不允許重複
每表數量上限1249含主鍵索引

實務決策指南

  • 主鍵/識別欄位 → 唯一叢集索引 (預設最佳)
  • 範圍查詢欄位 (日期、金額、序號) → 叢集索引 (若非主鍵)
  • 高選擇性點查詢欄位 → 非叢集索引
  • 頻繁更新的表 → 限制非叢集索引數量 (每次更新需同步維護索引)
  • 空間受限 → 優先叢集索引,審慎新增非叢集
  • 複合索引欄位順序:最高選擇性 (最唯一) 的欄位放最左

驗證索引效果

-- 查看執行計畫
SET SHOWPLAN_ALL ON;
GO
SELECT * FROM mytable WHERE mycolumn = 'value';
GO
SET SHOWPLAN_ALL OFF;

觀察是否出現 Index Seek 而非 Table Scan。

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