使用SQL Server動態(tài)管理視圖的方法
我們可以使用SQL Server動態(tài)管理視圖確認(rèn)缺失索引,下面就對這種SQL Server動態(tài)管理視圖的方法作詳細(xì)的介紹,供您參考。
由于有了很多新功能,我們可以看到在SQL Server 2005和現(xiàn)在有SQL Server 2008中,Microsoft引進(jìn)了一些動態(tài)管理視圖來協(xié)助確認(rèn)基于查詢歷史的可能索引候選人。
這些動態(tài)管理視圖是:
n sys.dm_db_missing_index_details –返回關(guān)于缺失索引的詳細(xì)信息。
n sys.dm_db_missing_index_group_stats - 返回缺失索引組的摘要信息
n sys.dm_db_missing_index_groups – 返回一個具體組的缺失索引的信息。
n sys.dm_db_missing_index_columns(index_handle) – 返回在一個索引中缺失的數(shù)據(jù)庫表列的信息。這是一個函數(shù),它要求傳遞index_handle。
和大多數(shù)動態(tài)管理視圖的跟蹤統(tǒng)計數(shù)據(jù)一樣,當(dāng)SQL Server實例重啟,這些數(shù)據(jù)被完全清除時,這些工作方式基本上是一樣的。所以如果你在一個測試環(huán)境中工作并且重啟你的SQL Server實例,那么這些視圖有可能不返回數(shù)據(jù)。
為了啟動,我們將使用一個從SQL Server 2005聯(lián)機(jī)幫助中得到的實例,這要求從AdventureWorks數(shù)據(jù)庫中查詢一張表而在StateProvinceID上沒有索引,如下所示:
- USE AdventureWorks;
- GO
- SELECT City, StateProvinceID, PostalCode
- FROM Person.Address
- WHERE StateProvinceID = 1;
- GO
一旦我們運行了上面的查詢,數(shù)據(jù)在動態(tài)管理視圖中應(yīng)該可用。讓我們來快速看下每一個查詢。
第一個查詢從sys.dm_db_missing_index_details視圖中獲取數(shù)據(jù)。這可能是最有用的一個查詢,因為這給我們展示了 object_id、equality_columns 和inequality_columns。另外,我們可以得到關(guān)于所含列的其它具體信息。
- SELECT * FROM sys.dm_db_missing_index_details
圖一
所以從上面我們執(zhí)行的查詢中,我們可以看到下面的信息:
n equality_columns = "StateProvinceID",這是因為這個字段和一個相等運算符在WHERE從句中使用。所以SQL Server告訴我們這將是針對索引的很好的選擇。
n inequality_columns = "NULL",如果你使用其它的運算符比如不相等,那么這個字段將會有數(shù)據(jù),但是由于我們使用等號,因此沒有一個字段將在這里使用。
n included_columns =這是當(dāng)創(chuàng)建一個索引時使用的其它字段。由于這個查詢只使用City、StateProvinceID 和 PostalCode,因此StateProvinceID將在索引中得到處理,當(dāng)該索引創(chuàng)建時,其它兩個字段可能被用作內(nèi)嵌的字段。
下一個索引從sys.dm_db_missing_index_group_stats中獲取數(shù)據(jù)。這個查詢使我們更了解其他統(tǒng)計數(shù)據(jù),例如編譯,用戶查找, 用戶掃描等,所以從這里我們可以知道這個查詢多久會被訪問。如果我們創(chuàng)建一個基于這些信息的新索引,這將幫助我們確定多久使用一個索引可以獲得數(shù)據(jù)。
- SELECT * FROM sys.dm_db_missing_index_group_stats
由于這個查詢我們只執(zhí)行了一次,因此我們的unique_compiles = 1 ,我們的 user_seeks = 1。如果我們再次運行這個查詢,我們的user_seeks應(yīng)該會增加。
圖二
下一個視圖sys.dm_db_missing_index_groups將會給我們提供index_group_handle 和 index_handle的信息。
- SELECT * FROM sys.dm_db_missing_index_groups
圖三
從上面查詢得到的結(jié)果基本上將用于從sys.dm_db_missing_index_columns函數(shù)中獲得數(shù)據(jù)。index_handle值被傳遞到下一個查詢,如下圖所示。
- SELECT * FROM sys.dm_db_missing_index_columns(1)
圖四
要得到在一個結(jié)果集顯示的所有數(shù)據(jù),下面從SQL Server 2005聯(lián)機(jī)幫助中得到的查詢將為我們提供這些數(shù)據(jù)。
- SELECT mig.*, statement AS table_name,
- column_id, column_name, column_usage
- FROM sys.dm_db_missing_index_details AS mid
- CROSS APPLY sys.dm_db_missing_index_columns (mid.index_handle)
- INNER JOIN sys.dm_db_missing_index_groups AS mig ON mig.index_handle = mid.index_handle
- ORDER BY mig.index_group_handle, mig.index_handle, column_id;
圖五
總結(jié)
n 基于這個例子我們可以看到,我們可以在表AdventureWorks.Person.Address的字段StateProvinceID上創(chuàng)建一個新索引,也可以包括columns City和PostalCode。
n 要注意的是當(dāng)你在一張表中增加或者刪除索引時,缺失索引的所有統(tǒng)計數(shù)據(jù)將在這張表中完全清除。
n 盡管這可能不是完美的,也存在一些局限,但是這至少讓我們了解了之前使用SQL Server舊版本時從來不知道的信息。
【編輯推薦】