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

SQL Server 索引建立與管理:T-SQL 指令、Enterprise Manager 圖形化操作、叢集/非叢集/唯一/複合索引完整教學

     編輯:關於SqlServer

T-SQL 建立索引指令大全

基本非叢集索引 (預設)

CREATE INDEX IX_MyTable_MyColumn ON MyTable (MyColumn);

叢集索引

CREATE CLUSTERED INDEX IX_MyTable_MyColumn_Clust ON MyTable (MyColumn);

允許重複鍵值的叢集索引

CREATE CLUSTERED INDEX IX_MyTable_MyColumn_Dup ON MyTable (MyColumn)
WITH ALLOW_DUP_ROW;  -- SQL 2000 語法,新版預設允許

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

CREATE UNIQUE CLUSTERED INDEX IX_MyTable_MyColumn_UClust ON MyTable (MyColumn);
CREATE UNIQUE NONCLUSTERED INDEX IX_MyTable_MyColumn_UNon ON MyTable (MyColumn);

複合索引 (多欄位,最多 16 欄位)

CREATE INDEX IX_Users_Name ON Users (FirstName, LastName);
-- 等同於
CREATE INDEX IX_Users_Name ON Users (FirstName ASC, LastName ASC);

刪除索引

DROP INDEX MyTable.IX_MyTable_MyColumn;  -- 必須指定表名.索引名

Enterprise Manager (SQL 2000) 圖形化建立索引

方法一:Manage Tables 視窗 (建立主索引/叢集索引)

  1. 展開資料庫 → Tables → 右鍵選擇表格 → 設計表格。
  2. 點選工具列「進階選項」按鈕 (表格前帶 + 號圖示)。
  3. 在「Primary Key」區域,下拉選單選擇欄位 (可多選建立複合主鍵)。
  4. 勾選「Create as CLUSTERED」決定叢集/非叢集。
  5. 儲存表格,索引自動建立。欄位旁出現鑰匙圖示。

注意:主索引欄位不得為 NULL,且強制唯一。

方法二:Manage Indexes 視窗 (建立一般非叢集索引)

  1. 選單「管理」→「索引」開啟 Manage Indexes 視窗。
  2. 「索引」下拉選單選「New Index」。
  3. 選擇欲索引欄位,點「新增」加入。
  4. 設定:「叢集/非叢集」、「唯一/非唯一」、「填滿因子」等選項。
  5. 確定建立。

索引屬性詳解

屬性說明建議值
Fill Factor (填滿因子)葉層頁面填滿百分比,預留空間減少頁分裂叢集索引 80-90;唯讀表 100;高頻插入 70
PAD_INDEX將 Fill Factor 套用至中間層頁面ON (配合 Fill Factor)
IGNORE_DUP_KEY唯一索引插入重複鍵時,忽略該列而非中止整批次特定業務需求才開啟
STATISTICS_NORECOMPUTE停用自動統計更新OFF (預設開啟)
ALLOW_ROW_LOCKS / ALLOW_PAGE_LOCKS允許列/頁鎖定ON (預設)
SORT_IN_TEMPDB建立索引時排序在 tempdb 進行大索引建立時 ON,減少使用者資料庫日誌
ONLINE線上建立/重建 (Enterprise Edition)ON (生產環境避免封鎖)

何時建立索引?決策清單

  1. WHERE/JOIN/ORDER BY/GROUP BY 高頻出現的欄位。
  2. 外鍵欄位 (連接效能)。
  3. 高選擇性 (基數大) 欄位。
  4. 覆蓋索引:INCLUDE 查詢常用非鍵欄位,消除 Key Lookup。
  5. 避免:極低選擇性 (性別、布林)、極高更新頻率、資料表極小 (< 100 頁)。

索引維護腳本 (生產環境排程)

-- 檢測碎片
SELECT OBJECT_NAME(ips.object_id) AS TableName,
       i.name AS IndexName,
       ips.index_type_desc,
       ips.avg_fragmentation_in_percent,
       ips.page_count
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') ips
JOIN sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
WHERE ips.avg_fragmentation_in_percent > 30 AND ips.page_count > 1000;

-- 重建/重組範例
ALTER INDEX IX_Table_Col ON TableName REBUILD WITH (FILLFACTOR = 80, ONLINE = ON);
ALTER INDEX IX_Table_Col ON TableName REORGANIZE;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved