熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

sql server如何識別真實和自動創建的索引

2013-11-15 14:34:50  來源: SQL Server 

  問我發現sysindexes索引表中的很多條目並不是我自己創建的聽說它們並不是真正的索引而是SQL Server查詢優化器自動創建的統計怎樣才能識別哪些是真正的索引哪些是SQL Server自動創建的統計呢?
  
  答按照默認設置如果表中的某列沒有索引則SQL Server會自動為該列創建統計然後查詢優化器評估該列中數據分布范圍的統計信息以選擇一個更為有效的查詢處理方案分辨自動創建的統計很簡單在SQL Server 和SQL Server 自動創建的統計的前綴為_WA_Sys
  
  您還可以使用INDEXPROPERTY()函數的IsAutoStatistics屬性來區分一個索引是真正的還是自動創建的統計讓SQL Server優化器選擇需要創建的統計您還可以為您管理的數據庫啟用自動創建統計表選項
  
  很多人忽略了下面的明顯的結論自動創建統計的存在意味著某個真正的索引可能會從中受益請考慮下列代碼的輸出
  
  USE tempdb
  GO
  IF OBJECTPROPERTY(OBJECT_ID(dboorders) IsUserTable)=
  DROP TABLE dboorders
  GO
  SELECT * INTO tempdborders FROM northwindorders
  GO
  SELECT * FROM tempdborders WHERE orderid =
  GO
  SELECT * FROM tempdbsysindexes WHERE id = object_id(orders)
  AND name LIKE
  _wa_sys%
  GO
  
  該代碼在tempdb中復制Northwind Orders表選擇一行然後檢查SQL Server是否添加了一個統計很顯然該表沒有OrderId列的索引所以SQL Server自動創建了名為_WA_Sys_OrderID_DD 的統計OrderId列統計表的存在表明Northwind Orders表將得益於附加的索引
  
  以下查詢顯示了為數據庫中每個用戶表自動創建的統計的數量該數據庫至少有一個自動創建的統計
  
  SELECT
  object_name(id) TableName
  count(*) NumberOfAutoStats
  FROM
  sysindexes
  WHERE
  OBJECTPROPERTY(id NIsUserTable) =
  AND INDEXPROPERTY ( id name IsAutoStatistics ) =
  GROUP BY
  object_name(id)
  ORDER BY
  count(*) DESC
  
  並不是所有的統計都可被真正的索引所替代在某些情況下SQL Server會為一個表自動創建超過個統計很明顯這些表的索引策略很差勁對表及自動創建的與之相關聯的統計的快速記數可以幫助您確定哪些表需要索引
  
  —Microsoft SQL Server開發團隊
  

From:http://tw.wingwit.com/Article/program/SQLServer/201311/22015.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.