標籤:style blog http ar color os 使用 sp java
轉自:http://www.cnblogs.com/lyhabc/archive/2013/02/10/2909761.html
當大家探索資料庫查詢效能很慢的時候,大家都會想到加索引來最佳化資料庫查詢效能,
但是面對一個複雜的SQL語句,找到一個最佳化的索引組合對人腦來講,真的不是一件很簡單的事。
好在SQLSERVER提供了兩種“自動”功能,給你建議,該怎麼調整索引
第一種是使用DMV
第二種是使用DTA (database engine tuning advisor) Database Engine Tuning Advisor
這篇文章主要講第一種
從SQL2005以後,在SQLSERVER對任何一句語句做編譯的時候,都會去評估一下,
這句話是不是缺少什麼索引的支援,如果他認為是,他還會預估,如果有這麽一個索引
他的效能能提高多少
SQLSERVER有幾個動態管理檢視
sys.dm_db_missing_index_details
sys.dm_db_missing_index_groups
sys.dm_db_missing_index_group_stats
sys.dm_db_missing_index_columns(index_handle)
sys.dm_db_missing_index_details
這個DMV記錄了當前資料庫下所有的missing index的資訊,他針對的是SQLSERVER從啟動以來所有啟動並執行語句,
而不是針對某一個查詢。DBA可以看看,哪些表格SQLSERVER對他是最有“意見”的
以下是這個DMV的各個欄位的解釋:
1、index_handle:標識特定的缺失索引。該標識符在伺服器中是唯一的。index_handle 是此表的密鑰
2、database_id :標識帶有缺失索引的表所駐留的資料庫
3、object_id :標識索引缺失的表
4、equality_columns:構成相等謂詞的列的逗號分隔列表 即哪個欄位缺失了索引會在這裡列出來(簡單來講就是where 後面的篩選欄位),
謂詞的形式如下:table.column =constant_value
5、inequality_columns :構成不等謂詞的列的逗號分隔列表,例如以下形式的謂詞:table.column > constant_value “=”之外的任何比較子都表示不相等。
6、included_columns:用於查詢的涵蓋列的逗號分隔列表(簡單來講就是 select 後面的欄位)。
7、statement:索引缺失的表的名稱
比如下面這個查詢結果
那麼應該建立這樣的索引
1 CREATE INDEX idx_SalesOrderDetail_test_ProductID_IncludeIndex ON SalesOrderDetail_test(ProductID) INCLUDE(SalesOrderID)
在ProductID上建立索引,SalesOrderID作為包含性列的索引
注意事項:
由 sys.dm_db_missing_index_details 返回的資訊會在查詢最佳化工具最佳化查詢時更新,因而不是持久化的。
缺失索引資訊只保留到重新啟動SQL Server 前。如果資料庫管理員要在伺服器回收後保留缺失索引資訊,
則應定期製作缺失索引資訊的備份副本
sys.dm_db_missing_index_columns(index_handle)
返回與缺少索引(不包括空間索引)的資料庫表列有關的資訊,sys.dm_db_missing_index_columns 是一個動態管理函數
欄位解釋
index_handle:唯一地標識缺失索引的整數。
sys.dm_db_missing_index_groups
返回有關特定缺失索引組中包含的缺失索引(不包括空間索引)的資訊
sys.dm_db_missing_index_group_stats
返回缺失索引組的摘要資訊,不包括空間索引
這個視圖說白了就是預估有這麽一個索引,他的效能能提高多少
有一個欄位比較重要:
avg_user_impact: 實現此缺失索引組後,使用者查詢可能獲得的平均百分比收益。該值表示如果實現此缺失索引組,則查詢成本將按此百分比平均下降。
就是說,增加了這個缺失索引,效能可以提高的百分比
下面是MSDN給出的樣本,缺失索引組控制代碼為 2
下面是MSDN給出的樣本,缺失索引組控制代碼為 2
1 --查詢提供缺失索引的資料庫、架構和表的名稱。它還提供應該用於索引鍵的列的名稱 2 USE [AdventureWorks] 3 GO 4 SELECT migs.group_handle, mid.* 5 FROM sys.dm_db_missing_index_group_stats AS migs 6 INNER JOIN sys.dm_db_missing_index_groups AS mig 7 ON (migs.group_handle = mig.index_group_handle) 8 INNER JOIN sys.dm_db_missing_index_details AS mid 9 ON (mig.index_handle = mid.index_handle)10 WHERE migs.group_handle = 2
範例程式碼:
1 USE [AdventureWorks] --要查詢索引缺失的資料庫2 GO3 SELECT * FROM sys.[dm_db_missing_index_details]4 SELECT * FROM sys.[dm_db_missing_index_groups]5 SELECT * FROM sys.[dm_db_missing_index_group_stats]6 SELECT * FROM sys.[dm_db_missing_index_columns](1) --1 :1是根據dm_db_missing_index_details查出來的
我估計XX大俠做的SQLSERVER索引最佳化器也使用了"sys.dm_db_missing_index_details" 這個DMV
剛才看了一下,好像有錯別字:Total Cost不是Totol Cost
暫時不知道Total Cost跟Improvement Measure怎麽算出來的
上面幾個DMV的欄位解釋,大家可以看一下MSDN,非常詳細
sys.dm_db_missing_index_group_stats
msdn:http://msdn.microsoft.com/zh-cn/library/ms345421.aspx
sys.dm_db_missing_index_groups
msdn:http://msdn.microsoft.com/zh-cn/library/ms345407.aspx
sys.dm_db_missing_index_columns([sql_handle])
msdn:http://msdn.microsoft.com/zh-cn/library/ms345364.aspx
sys.dm_db_missing_index_details
msdn:http://msdn.microsoft.com/zh-cn/library/ms345434.aspx
注意:
最後大家還需要注意一下,雖然這些DMV給出的建議還是比較合理的。
但是,DBA還是需要去確認一下建議。因為這個建議完全是根據語句本身給出的,
沒有考慮對其他語句的影響,也沒有考慮維護索引的成本,所以是很片面的。
其準確性,也要再確認一下
SQLSERVER如何查看索引缺失