Table of Contents
Toggle一、查單一資料表的索引資訊重點範例 SQL範例結果說明:二、查整個資料庫所有索引(含表名)重點範例 SQL查詢結果範例三、查看索引的碎裂狀況(延伸用途)重點範例 SQL掃描模式說明查詢結果範例整體建議小結備註一、查單一資料表的索引資訊重點使用 sp_helpindex 可快速查看指定資料表的索引。 可顯示:索引名稱、描述(是否 clustered、unique、主鍵等)、索引欄位。 此方法最快速,但輸出欄名為系統預設(不可改為中文)。
範例 SQLEXEC sp_helpindex '資料表名稱';範例結果說明:索引名稱索引描述索引欄位PK_Customersclustered, unique, primary key located on PRIMARYCustomerIDIX_Customers_Namenonclustered located on PRIMARYName二、查整個資料庫所有索引(含表名)重點可查看整個資料庫中所有資料表的索引與對應欄位。 常用於檢查哪些欄位已建索引。 使用系統資料表 sys.indexes、sys.tables、sys.columns。 可設定中文別名,讓輸出更清楚。
範例 SQLSELECT
t.name AS [資料表名稱], -- Table name
i.name AS [索引名稱], -- Index name
i.type_desc AS [索引類型], -- Clustered / Nonclustered
c.name AS [欄位名稱], -- Column name
ic.key_ordinal AS [索引欄位順序], -- 第幾個欄位在索引內
i.is_unique AS [是否唯一], -- 是否 UNIQUE
i.is_primary_key AS [是否主鍵], -- 是否為 PRIMARY KEY
i.is_disabled AS [是否停用] -- 索引是否被禁用
FROM sys.indexes AS i
INNER JOIN sys.index_columns AS ic
ON i.object_id = ic.object_id AND i.index_id = ic.index_id
INNER JOIN sys.columns AS c
ON ic.object_id = c.object_id AND ic.column_id = c.column_id
INNER JOIN sys.tables AS t
ON i.object_id = t.object_id
WHERE i.is_hypothetical = 0
AND i.index_id > 0 -- 排除 HEAP 結構(沒有 Clustered Index 的資料表)
ORDER BY t.name, i.name, ic.key_ordinal;查詢結果範例資料表名稱索引名稱索引類型欄位名稱索引欄位順序是否唯一是否主鍵是否停用CustomersPK_CustomersCLUSTEREDCustomerID1110CustomersIX_Customers_NameNONCLUSTEREDName1000三、查看索引的碎裂狀況(延伸用途)重點可檢查每個索引的碎裂率(Fragmentation)。 碎裂率處理建議:
< 5%:不需要處理5-30%:建議 REORGANIZE(線上操作,較輕量)> 30%:建議 REBUILD(可能需要停機或使用 ONLINE 選項) 可搭配自動化維護排程定期執行。範例 SQLSELECT
t.name AS [資料表名稱],
i.name AS [索引名稱],
i.type_desc AS [索引類型],
ps.avg_fragmentation_in_percent AS [碎裂率百分比],
ps.page_count AS [資料頁數]
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'SAMPLED') AS ps
JOIN sys.indexes AS i
ON ps.object_id = i.object_id AND ps.index_id = i.index_id
JOIN sys.tables AS t
ON i.object_id = t.object_id
WHERE ps.database_id = DB_ID()
AND ps.page_count > 1000 -- 過濾小型索引,避免誤判
ORDER BY ps.avg_fragmentation_in_percent DESC;掃描模式說明'LIMITED':最快速,適合日常監控,但精確度較低'SAMPLED':抽樣掃描,平衡速度與精確度(建議使用)'DETAILED':最精確,但耗時較長,適合維護決策前使用查詢結果範例資料表名稱索引名稱索引類型碎裂率百分比資料頁數OrdersIX_Orders_DateNONCLUSTERED45.828400CustomersPK_CustomersCLUSTERED2.31560整體建議小結項目用途1️⃣ sp_helpindex快速查看單一資料表的索引結構2️⃣ 系統表查詢 (sys.indexes)檢視整個資料庫索引詳細資訊3️⃣ sys.dm_db_index_physical_stats監控索引碎裂率,決定是否 Rebuild / Reorganize備註本筆記由 ChatGPT (GPT-5) 協助內容整理與範例 SQL 說明。 目的在於記錄 MSSQL 索引管理與效能優化實務,可作為工作維運與學習參考。