首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 識別真實索引與自動統計資料:_WA_Sys 前綴與 INDEXPROPERTY 實戰判別法

     編輯:MySQL 資料庫相關知識

sysindexes 中混雜使用者建立索引與查詢最佳化器自動建立的統計資料。本文教你快速辨識兩者,並利用自動統計反推缺失索引。

自動統計命名規則

SQL Server 7.0/2000:自動統計名稱統一以 _WA_Sys_ 開頭,後接欄位名與雜湊值。
範例:_WA_Sys_OrderID_58D1301D。

程式化判別:INDEXPROPERTY()

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
  • 自動統計數量多的資料表,索引策略通常較差。
  • 快速統計可優先針對這些表進行索引調優。

驗證範例:Orders 表無 OrderID 索引 → 產生自動統計

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 缺索引

注意事項

  • 並非所有自動統計都適合建立索引 (如極低選擇性欄位、極小表)。
  • 部分表自動統計超過 50 個,顯示索引設計嚴重不足,需整體檢視。
  • 啟用資料庫選項 Auto Create Statistics 讓最佳化器自動管理。

總結

_WA_Sys_ 前綴與 INDEXPROPERTY(..., 'IsAutoStatistics') 是識別自動統計的雙重保險。善用自動統計分布,能快速定位缺失索引、優化查詢效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved