在 sysindexes(或新版 sys.indexes/sys.stats)中,常看到許多非手動建立的條目。這些多半是查詢最佳化工具自動建立的統計資料,而非真實索引。辨譯兩者對索引調校至關重要。
SQL Server 7.0/2000/2005+:自動統計資料名稱前綴為 _WA_Sys_,後接欄位名與雜湊值,例如 _WA_Sys_OrderID_58D1301D。
SELECT
OBJECT_NAME(id) AS TableName,
name AS IndexOrStatName,
INDEXPROPERTY(id, name, 'IsAutoStatistics') AS IsAutoStat
FROM sysindexes
WHERE OBJECTPROPERTY(id, 'IsUserTable') = 1;
IsAutoStatistics = 1 表示為自動統計資料;0 為使用者建立的索引/統計資料。
USE tempdb;
GO
IF OBJECT_ID('dbo.orders') IS NOT NULL DROP TABLE dbo.orders;
GO
SELECT * INTO tempdb..orders FROM Northwind..orders;
GO
-- 查詢無索引欄位,觸發自動統計建立
SELECT * FROM tempdb..orders WHERE OrderID = 10248;
GO
-- 檢查自動統計
SELECT * FROM tempdb..sysindexes
WHERE id = OBJECT_ID('orders') AND name LIKE '_WA_Sys%';
結果會出現 _WA_Sys_OrderID_...,證明 OrderID 缺乏索引,查詢最佳化工具被迫依賴統計資料估算選擇率。結論:自動統計的存在 = 潛在索引機會。
SELECT
OBJECT_NAME(id) AS TableName,
COUNT(*) AS AutoStatsCount
FROM sysindexes
WHERE OBJECTPROPERTY(id, 'IsUserTable') = 1
AND INDEXPROPERTY(id, name, 'IsAutoStatistics') = 1
GROUP BY OBJECT_NAME(id)
ORDER BY COUNT(*) DESC;
若某表自動統計超過 50 個,強烈暗示索引策略嚴重不足,應優先檢視該表查詢模式並補建索引。
SQL Server 2005+ 建議使用 sys.stats 與 sys.indexes:
SELECT
OBJECT_NAME(object_id) AS TableName,
name AS StatName,
auto_created AS IsAutoStat
FROM sys.stats
WHERE auto_created = 1
AND OBJECTPROPERTY(object_id, 'IsUserTable') = 1;