快速找出資料庫的效能問題之 缺失索引 無用的索引

2021-09-08 14:46:48 字數 2250 閱讀 2610

我們通過減少查詢中的不必要的讀取操作從而使得查詢的效能得到提公升。乙個查詢在資料庫中執行的讀操作越多,那麼就對磁碟,cpu,記憶體的壓力越大。除非整個資料庫的資料全在在記憶體中,否則每次的讀操作都會把資料從磁碟讀入到記憶體中,然後返回。

乙個查詢在讀取乙個資源的時候,通過加鎖會阻止其他的查詢對這個資源進行修改,此時其他要操作這個資源的查詢就需要等待,從而導致了延時。

誠然,有些等待是必須的,讀取操作也是必須的,但是一些因為我們**或者設計導致的過度的讀取操作和等待,那就會嚴重影響效能,尤其是當資料庫的訪問量開始變大的時候。

可以說在sql server中,最高效的讀取資料方式就是通過索引去獲取資料。如果在資料表中存在缺失索引的問題,結果可想而知。

在本篇中,我們將會討論下面幾個議題:

如何識別缺失索引效能問題

識別沒有用的索引

如何解決上面的問題

確實本篇講述的內容涉及到了一些與資料庫效能調優的話題,對於調優而言,難點很多時候在於如何正確的找出效能問題。

下面,我們首先來看看缺失索引。

缺失索引

sql server可以在表字段上面建立索引,從而使得where和join這樣的語句執行的更快。當查詢優化器在優化乙個查詢的時候,它會儲存一些來暗示哪些列上可能建立索引之後可能性能會更快的資訊。我們可以通過動態管理檢視sys.dm_db_missing_index_details來檢視,執行如下查詢

查詢的結果如下:

下面,我們就來稍微的解釋一下結果中主要欄位的含義:

欄位名字 說明

databasename

告訴我們是哪乙個資料庫上面存在缺失索引的問題

equality_columns

如果在某個字段上面進行了相等的操作,例如name=』agilesharp』,在name欄位上面進行了判等的操作,如果查詢優化器認為這個name上面缺失索引,那麼這個name就會出現在上述查詢的結果中。

多個字段,用逗號分割

inquality_columns

在某個欄位上進行了不等的操作,例如id>1等,如果id上面存在缺失索引,那麼id就會出現在這裡

included_columns

告訴我們那些資料列可以作為索引包含列放在索引中,從而減少書籤查詢的開銷

statement

告訴哪乙個表上面存在缺失索引的問題

當然,上面的dmv查詢所得到的結果只是推薦結果,至於是否要去在相應的列上面建立索引,還需要進行綜合的分析,不能單靠一方面來判斷,例如,我們可以在去制定一些計畫去執行sql profiler去跟蹤資料庫,然後分析跟蹤的資料,並且分析這個列的資料的分布情況,分析資料的密度和差異性,而且還可以進一步的分析列的統計資訊,然後決定是否要加索引。

注:我也正在寫sql server profiler

的調優是個非常深的話題,大家可以通過我這裡的一些問題在掌握一些所謂的小技巧,起到乙個拋磚引玉的作用!

說了這麼多,可能大家感覺像是沒有說,感覺有點虛。確實,我也感覺這樣,因為就這分析缺失索引的問題要考慮的問題就n多。agilesharp的其他系列文章也在討論sql server的效能問題,這裡,我們就不多說,也不把問題搞複雜了。我再送朋友一段分析的**,可以更好的幫助我們找到缺失索引的問題:

上面的查詢比較不錯,按照成本進行了分析,成本越大,就說明加了索引之後,收益就越大,可以看到如下的結果:

然後大家加了索引之後,可以多多的測試,可以檢視執行計畫,也可以檢視查詢的資料頁的讀取情況,i/o的情況:

沒有用的索引

正如在上一小節所的講的,建立乙個索引是乙個非常需要重視的問題,需要考慮很多的方面,因為,如果我們建立的索引沒有發揮作用,甚至說,查詢優化器不採用我們的索引,那麼就會帶來適得其反的效果。

索引的維護是需要成本,甚至使得資料庫的效能變得很低,特別實在資料更新的時候。當在資料表上面進行資料的更新,刪除,和插入的時候,都會導致索引頁發生重新的調整,導致索引頁中的資料重新的排序,從而導致資料表被鎖定。

所以,我們很有必要找出沒有發揮作用的索引,我們還是可以採用dmv來快速的檢視:

這裡不否認,要完全明白上面的查詢的意思卻不是一件容易的事情,大家可以暫時不用懂,可以把這些指令碼儲存起來,作為乙個小的工具使用。

查詢結果如下:

因為我這裡採用的是乙個示例資料庫,所以看到的結果不是很多,但是可以發現:這些索引一些在被不斷的更新(user_updates),但是沒有被用過(system usage)。

對無用索引的解決很簡單:刪除索引就ok了。

附件:scripts.zip

快速找出資料庫的效能問題之 缺失索引 無用的索引

我們通過減少查詢中的不必要的讀取操作從而使得查詢的效能得到提公升。乙個查詢在資料庫中執行的讀操作越多,那麼就對磁碟,cpu,記憶體的壓力越大。除非整個資料庫的資料全在在記憶體中,否則每次的讀操作都會把資料從磁碟讀入到記憶體中,然後返回。乙個查詢在讀取乙個資源的時候,通過加鎖會阻止其他的查詢對這個資源...

Oracle資料庫備份資料缺失的問題

專案中一直在使用oracle資料庫,由於我之前更多的是關注orm對映框架,幾乎沒有關注過oracle特性的東西,很多東西都不知道,而且專案中換資料庫的概率幾乎為零,所以有必要好好研究一下oracle。正所謂,不怕不知道,就怕不知道嘛。不然遇到問題,都不知道從 下手。這兩天的oracle學習,收穫不小...

資料庫效能問題 索引

一 現象 tps很低,響應時間很長,資料庫伺服器cpu很高 接近100 應用伺服器負載比較低 二 開啟慢查詢配置 1 在mysql配置檔案 etc my.cnf中增加 slow query log 1 long query time 0.1 slow query log 這是乙個布林型變數,預設為真...