發(fā)現(xiàn)那些未被使用的數(shù)據(jù)庫(kù)索引
為了確??焖僭L問數(shù)據(jù),和其他關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)一樣SQL Server 會(huì)利用索引來快速的查找數(shù)據(jù),SQL Server可以創(chuàng)建諸如聚集索引、非聚集索引、XML索引和全文本索引的不同類型的索引。
有多個(gè)索引的好處是如果存在合適的索引,SQL Server可以快速存取數(shù)據(jù),有太多索引的缺點(diǎn)是SQL Server不得不維護(hù)這些索引,維護(hù)也需要代價(jià),并且索引也需要額外的存儲(chǔ)空間,所以,索引對(duì)性能來講是一把雙刃劍。
下來我們看看如何標(biāo)識(shí)存在但沒有被使用到的索引,進(jìn)而刪除他們,降低存儲(chǔ)需求。
我們知道SQL Server 2005增加了DMVs-動(dòng)態(tài)管理視圖,允許你更深一步窺探在SQL Servr里發(fā)生了什么,其中一些是用來查看索引是怎么被使用的,我們討論兩個(gè)DMVs,注意這些視圖存儲(chǔ)累積的數(shù)據(jù),所以SQL Server重置狀態(tài)時(shí),計(jì)數(shù)器要?dú)w0,所以當(dāng)監(jiān)視索引使用時(shí)要注意這些。
- DMV- sys.dm_db_index_operational_stats
這個(gè)DMV 允許您查看插入、 更新和刪除的索引的各個(gè)方面的信息,基本上它會(huì)顯示在用在基于數(shù)據(jù)的修改方面維護(hù)索引的很多工作。
如果你對(duì)表的查詢返回了所有列,輸出可能會(huì)令人困惑,所以我們把焦點(diǎn)集中到少許列上,想知道其他列的情況可以查看Online Books
- SELECT OBJECT_NAME(A.[OBJECT_ID]) AS [OBJECT NAME],
- I.[NAME] AS [INDEX NAME],
- A.LEAF_INSERT_COUNT,
- A.LEAF_UPDATE_COUNT,
- A.LEAF_DELETE_COUNT
- FROM SYS.DM_DB_INDEX_OPERATIONAL_STATS (db_id(),NULL,NULL,NULL ) A
- INNER JOIN SYS.INDEXES AS I
- ON I.[OBJECT_ID] = A.[OBJECT_ID]
- AND I.INDEX_ID = A.INDEX_ID
- WHERE OBJECTPROPERTY(A.[OBJECT_ID],’IsUserTable’) = 1
下面我們就看到inserts,updates,deletes發(fā)生在每一個(gè)索引上的數(shù)字,所以,這表明SQL Server花費(fèi)許多工作不得不維護(hù)索引
- DMV – sys.dm_db_index_usage_stats
這個(gè)DMV顯示索引在用戶的查詢中使用了多少次,其他列請(qǐng)參閱聯(lián)機(jī)叢書。
- SELECT OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME],
- I.[NAME] AS [INDEX NAME],
- USER_SEEKS,
- USER_SCANS,
- USER_LOOKUPS,
- USER_UPDATES
- FROM SYS.DM_DB_INDEX_USAGE_STATS AS S
- INNER JOIN SYS.INDEXES AS I ON I.[OBJECT_ID] = S.[OBJECT_ID] AND I.INDEX_ID = S.INDEX_ID
- WHERE OBJECTPROPERTY(S.[OBJECT_ID],’IsUserTable’) = 1
- AND S.database_id = DB_ID()
我們使用了seeks,scans,lookups和updates
- The seeks 搜索指的是在Index上發(fā)生了多少次Index Seek,seek是最快的訪問數(shù)據(jù)的方式。
- The scans 掃描指的是在index上發(fā)生了多少次index Scan,Scan 是從多行數(shù)據(jù)中查找你想要的數(shù)據(jù),應(yīng)盡量避免scan
- The lookups 查找是指查詢所需的數(shù)據(jù)有多少次是從Clustered index 或者是heap中進(jìn)行的
- The updates 更新是指由于數(shù)據(jù)的更新導(dǎo)致index被更改了多少次
標(biāo)識(shí)未使用的索引
基于以上的輸出結(jié)果我們把焦點(diǎn)定位到第二個(gè)查詢上,我們能看到這個(gè)索引沒有發(fā)生過seeks,scans和lookup,但是發(fā)生了updates,這意味著SQL Server在滿足查詢時(shí)沒有使用到這個(gè)index,但是仍然需要維護(hù)它,記住從DMVs獲得的這些數(shù)據(jù)當(dāng)SQL Server重新啟動(dòng)時(shí)要復(fù)位,為確定哪一個(gè)index應(yīng)該保留還是刪除要確保你采集的是足夠長(zhǎng)一段時(shí)間的數(shù)據(jù)。