前言感想:一時興起,突然想寫一個關于MS SQL的巡檢系列方面的文章,因為我覺得這方面的知識分享是有價值,也是非常有意義的。一方面,很多經驗不足的人,對于巡檢有點茫然,不知道要從哪些方面巡檢,另外一方面,網上關于MS SQL巡檢方面的資料好像也不是特别多。寫這個系列隻是一個分享,自己的初衷是一個知識梳理、總結提煉過程,有些知識和腳本也不是原創,文章很多地方也是融入了自己的一些想法和見解的,不足和膚淺之處肯定也非常多,抛磚引玉,也希望大家提意見和建議、補充,指正其中的不足之處。Stay Hungry Stay Foolish!
在SQL Server資料庫中,有可能存在重複的索引(Duplicate Indexes),這個不僅影響性能(INSERT、UPDATE、DELETE時帶來額外的IO開銷,當資料庫維護,索引重組時也會帶來額外的開銷),而且占用空間。資料庫存在重複索引(Duplicate Indexes)的原因是多方面的,很多時候、很多事情不是你所能完全掌控的,除非你所管理的資料庫非正常範,權限控制、腳本釋出非常嚴格、流程化。暫且不說這些,那麼怎麼在資料庫巡檢過程找出這些重複的索引(Duplicate Indexes)呢? 下面分享一個我在Premier Proactive Services中發現一個的腳本(做了一些修改和調整)。
我們以AdventureWorks2014資料庫為例,如下所示,表[Person].[Address]下有4個索引,如下所示
<a href="http://images2015.cnblogs.com/blog/73542/201611/73542-20161105092840752-1212947727.png"></a>
假設某個二愣子在這個表的字段StateProvinceID上建立了下面重複索引,IX_Address_N1 與IX_Address_StateProvinceID是一個重複索引。
那麼我們執行下面腳本就能找到這個重複的索引,如下所示
<a href="http://images2015.cnblogs.com/blog/73542/201611/73542-20161105092841502-299316375.png"></a>
注意,關于重複索引(Duplicate Indexes)表示存在的索引除了名字不一樣外, 索引所在字段以及索引字段順序都是一樣的。An index is considered to be a duplicate if it references the same column and ordinal position as another index in the same database。 這個腳本是找出一模一樣的索引,如果你建立下面索引,索引字段一樣,但是有包含列字段不一樣,那麼這個腳本會将這個索引視為不一樣的索引。有興趣可以自己試試。
CREATE INDEX IX_Address_N2 ON [Person].[Address](StateProvinceID) INCLUDE (City);
另外關于XML索引的重複索引,可以使用下面腳本檢查。
在每個庫跑一次這個腳本,就能将所有的重複的索引(Duplicate Indexes)全部找出,但是當手頭伺服器、資料庫特别多時,這個工作也是一個體力活,可以将這個正常工作自動化,避免重複勞動,我将這個內建在MyDBA工具裡面,隻需要點選一下滑鼠,就可以幫助我自動處理這些工作。