sysindexes 中混雜使用者建立索引與查詢最佳化器自動建立的統計資料。本文教你快速辨識兩者,並利用自動統計反推缺失索引。
SQL Server 7.0/2000:自動統計名稱統一以 _WA_Sys_ 開頭,後接欄位名與雜湊值。
範例:_WA_Sys_OrderID_58D1301D。
SELECT INDEXPROPERTY(OBJECT_ID('table_name'), 'index_name', 'IsAutoStatistics')
-- 1 = 自動統計,0 = 真實索引
最佳化器因查詢條件欄位無索引,才被迫建立統計以估算選擇率。
存在自動統計 = 該欄位極可能受益於建立真實索引。
SELECT OBJECT_NAME(id) AS TableName, COUNT(*) AS NumberOfAutoStats
FROM sysindexes
WHERE OBJECTPROPERTY(id, 'IsUserTable') = 1
AND INDEXPROPERTY(id, name, 'IsAutoStatistics') = 1
GROUP BY OBJECT_NAME(id)
ORDER BY COUNT(*) DESC
SELECT * INTO tempdb..orders FROM northwind..orders
SELECT * FROM tempdb..orders WHERE orderid = 10248 -- 觸發自動統計建立
SELECT * FROM tempdb..sysindexes WHERE id = OBJECT_ID('orders') AND name LIKE '_wa_sys%'
-- 產生 _WA_Sys_OrderID_xxx,證明 OrderID 缺索引
_WA_Sys_ 前綴與 INDEXPROPERTY(..., 'IsAutoStatistics') 是識別自動統計的雙重保險。善用自動統計分布,能快速定位缺失索引、優化查詢效能。