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

如何分辨 SQL Server 真實索引與自動建立的統計資料

     編輯:關於SqlServer

在 sysindexes(或新版 sys.indexes/sys.stats)中,常看到許多非手動建立的條目。這些多半是查詢最佳化工具自動建立的統計資料,而非真實索引。辨譯兩者對索引調校至關重要。

自動統計資料命名規則

SQL Server 7.0/2000/2005+:自動統計資料名稱前綴為 _WA_Sys_,後接欄位名與雜湊值,例如 _WA_Sys_OrderID_58D1301D。

程式化判斷:INDEXPROPERTY()

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;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved