當(dāng)大家發(fā)現(xiàn)數(shù)據(jù)庫(kù)查詢性能很慢的時(shí)候,大家都會(huì)想到加索引來(lái)優(yōu)化數(shù)據(jù)庫(kù)查詢性能,但是面對(duì)一個(gè)復(fù)雜的SQL語(yǔ)句,找到一個(gè)優(yōu)化的索引組合對(duì)人腦來(lái)講,真的不是一件很簡(jiǎn)單的事。
好在SQLSERVER提供了兩種“自動(dòng)”功能,給你建議,該怎么調(diào)整索引
第一種是使用DMV
第二種是使用DTA (database engine tuning advisor) 數(shù)據(jù)庫(kù)引擎優(yōu)化顧問(wèn)
這篇文章主要講第一種
從SQL2005以后,在SQLSERVER對(duì)任何一句語(yǔ)句做編譯的時(shí)候,都會(huì)去評(píng)估一下,
這句話是不是缺少什么索引的支持,如果他認(rèn)為是,他還會(huì)預(yù)估,如果有這麼一個(gè)索引
他的性能能提高多少
SQLSERVER有幾個(gè)動(dòng)態(tài)管理視圖
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
這個(gè)DMV記錄了當(dāng)前數(shù)據(jù)庫(kù)下所有的missing index的信息,他針對(duì)的是SQLSERVER從啟動(dòng)以來(lái)所有運(yùn)行的語(yǔ)句,
而不是針對(duì)某一個(gè)查詢。DBA可以看看,哪些表格SQLSERVER對(duì)他是最有“意見(jiàn)”的
以下是這個(gè)DMV的各個(gè)字段的解釋:
1、index_handle:標(biāo)識(shí)特定的缺失索引。該標(biāo)識(shí)符在服務(wù)器中是唯一的。index_handle 是此表的密鑰
2、database_id :標(biāo)識(shí)帶有缺失索引的表所駐留的數(shù)據(jù)庫(kù)
3、object_id :標(biāo)識(shí)索引缺失的表
4、equality_columns:構(gòu)成相等謂詞的列的逗號(hào)分隔列表 即哪個(gè)字段缺失了索引會(huì)在這里列出來(lái)(簡(jiǎn)單來(lái)講就是where 后面的篩選字段),
謂詞的形式如下:table.column =constant_value
5、inequality_columns :構(gòu)成不等謂詞的列的逗號(hào)分隔列表,例如以下形式的謂詞:table.column > constant_value “=”之外的任何比較運(yùn)算符都表示不相等。
6、included_columns:用于查詢的涵蓋列的逗號(hào)分隔列表(簡(jiǎn)單來(lái)講就是 select 后面的字段)。
7、statement:索引缺失的表的名稱
比如下面這個(gè)查詢結(jié)果
那么應(yīng)該創(chuàng)建這樣的索引
復(fù)制代碼 代碼如下:
CREATE INDEX idx_SalesOrderDetail_test_ProductID_IncludeIndex ON SalesOrderDetail_test(ProductID) INCLUDE(SalesOrderID)
在ProductID上創(chuàng)建索引,SalesOrderID作為包含性列的索引
注意事項(xiàng):
由 sys.dm_db_missing_index_details 返回的信息會(huì)在查詢優(yōu)化器優(yōu)化查詢時(shí)更新,因而不是持久化的。
缺失索引信息只保留到重新啟動(dòng) SQL Server 前。如果數(shù)據(jù)庫(kù)管理員要在服務(wù)器回收后保留缺失索引信息,
則應(yīng)定期制作缺失索引信息的備份副本
sys.dm_db_missing_index_columns(index_handle)
返回與缺少索引(不包括空間索引)的數(shù)據(jù)庫(kù)表列有關(guān)的信息,sys.dm_db_missing_index_columns 是一個(gè)動(dòng)態(tài)管理函數(shù)
字段解釋
index_handle:唯一地標(biāo)識(shí)缺失索引的整數(shù)。
sys.dm_db_missing_index_groups
返回有關(guān)特定缺失索引組中包含的缺失索引(不包括空間索引)的信息
sys.dm_db_missing_index_group_stats
返回缺失索引組的摘要信息,不包括空間索引
這個(gè)視圖說(shuō)白了就是預(yù)估有這麼一個(gè)索引,他的性能能提高多少
有一個(gè)字段比較重要:
avg_user_impact: 實(shí)現(xiàn)此缺失索引組后,用戶查詢可能獲得的平均百分比收益。該值表示如果實(shí)現(xiàn)此缺失索引組,則查詢成本將按此百分比平均下降。
就是說(shuō),增加了這個(gè)缺失索引,性能可以提高的百分比
下面是MSDN給出的示例,缺失索引組句柄為 2
復(fù)制代碼 代碼如下:
--查詢提供缺失索引的數(shù)據(jù)庫(kù)、架構(gòu)和表的名稱。它還提供應(yīng)該用于索引鍵的列的名稱
USE [AdventureWorks]
GO
SELECT migs.group_handle, mid.*
FROM sys.dm_db_missing_index_group_stats AS migs
INNER JOIN sys.dm_db_missing_index_groups AS mig
ON (migs.group_handle = mig.index_group_handle)
INNER JOIN sys.dm_db_missing_index_details AS mid
ON (mig.index_handle = mid.index_handle)
WHERE migs.group_handle = 2
示例代碼:
復(fù)制代碼 代碼如下:
USE [AdventureWorks] --要查詢索引缺失的數(shù)據(jù)庫(kù)
GO
SELECT * FROM sys.[dm_db_missing_index_details]
SELECT * FROM sys.[dm_db_missing_index_groups]
SELECT * FROM sys.[dm_db_missing_index_group_stats]
SELECT * FROM sys.[dm_db_missing_index_columns](1) --1 :1是根據(jù)dm_db_missing_index_details查出來(lái)的
我估計(jì)XX大俠做的SQLSERVER索引優(yōu)化器也使用了"sys.dm_db_missing_index_details" 這個(gè)DMV
剛才看了一下,好像有錯(cuò)別字:Total Cost不是Totol Cost
暫時(shí)不知道Total Cost跟Improvement Measure怎麼算出來(lái)的
注意:
最后大家還需要注意一下,雖然這些DMV給出的建議還是比較合理的。
但是,DBA還是需要去確認(rèn)一下建議。因?yàn)檫@個(gè)建議完全是根據(jù)語(yǔ)句本身給出的,
沒(méi)有考慮對(duì)其他語(yǔ)句的影響,也沒(méi)有考慮維護(hù)索引的成本,所以是很片面的。
其準(zhǔn)確性,也要再確認(rèn)一下
上面幾個(gè)DMV的字段解釋,大家可以看一下MSDN,非常詳細(xì)
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
您可能感興趣的文章:- 淺析SQL Server 聚焦索引對(duì)非聚集索引的影響
- 淺述SQL Server的聚焦強(qiáng)制索引查詢條件和Columnstore Index
- 淺析SQL Server的聚焦使用索引和查詢執(zhí)行計(jì)劃
- 詳解sqlserver查詢表索引
- SQL SERVER 2008 R2 重建索引的方法
- SQLSERVER全文目錄全文索引的使用方法和區(qū)別講解
- SQL_Server全文索引的使用實(shí)例演示
- SQL_Server全文索引的用法解析
- SQLSERVER對(duì)索引的利用及非SARG運(yùn)算符認(rèn)識(shí)
- sqlserver索引的原理及索引建立的注意事項(xiàng)小結(jié)
- sqlserver2005自動(dòng)創(chuàng)建數(shù)據(jù)表和自動(dòng)添加某個(gè)字段索引
- SQL Server 數(shù)據(jù)庫(kù)索引其索引的小技巧
- 詳解SQL Server的聚焦過(guò)濾索引