EXPERT FOR SQL SERVER診斷系列--索引


概述

 
索引設計是數據庫設計中比較重要的一個環節,對數據庫的性能起着至關重要的作用,但是索引的設計卻又不是那么容易的事情,性能也不是那么輕易就獲取到的,很多的技術人員因為不恰當的創建索引,最后使得其效果適得其反,可以說“成也索引,敗也索引”。在我經歷過的,眾多的數據庫性能問題案例中,80% 系統都存在索引不合理的問題.
 
 

為什么需要索引

 
數據在磁盤上是以塊的形式存儲的。為確保對磁盤操作的原子性,訪問數據的時候會一並訪問所有數據塊。磁盤上的這些數據塊與鏈表類似,即它們都包含一個數據段和一個指針,指針指向下一個節點(數據塊)的內存地址,而且它們都不需要連續存儲(即邏輯上相鄰的數據塊在物理上可以相隔很遠)。
鑒於很多記錄只能做到按一個字段排序,所以要查詢某個未經排序的字段,就需要使用線性查找,即要訪問N/2個數據塊,其中N指的是一個表所涵蓋的所有數據塊。如果該字段是非鍵字段(也就是說,不包含唯一值),那么就要搜索整個表空間,即要訪問全部N個數據塊。
然而,對於經過排序的字段,可以使用二分查找,因此只要訪問log2 N個數據塊。同樣,對於已經排過序的非鍵字段,只要找到更大的值,也就不用再搜索表中的其他數據塊了。這樣一來,性能就會有實質性的提升。
舉個例子,我們使用微軟的示例數據庫, 對於下面的查詢:
select SalesOrderDetailID FROM Sales.SalesOrderDetail WHERE SalesOrderDetailID=61026
1.SalesOrderDetailID 列沒有索引
查詢會進行全表掃描。邏輯讀如下圖:
 
表的數據頁數如下所示,兩者是幾乎相等的。說明他對每個數據頁都進行需要讀取一次。

 

2.SalesOrderDetailID 建立索引,邏輯讀取僅2次。
因為log2 1246 是等於10.28. 最大的邏輯讀取次數是11.
 

 

利用EXPERT找到缺失索引

 
既然索引對我們如此重要,那么我們如何去快速,方便的找到需要的索引呢。利用體檢專家可以輕松做到。

1.通過執行計划

在執行計划選項卡,對於查詢語句,如果存在缺失索引,體檢專家會在缺失索引列上打鈎,如圖所示。
同時列出SQL了 語句執行次數和執行時間。
 

 

2.通過數據庫

在數據庫選項卡中,選中缺失索引,體檢專家會自動列出數據庫中所有的缺失索引。
 
 

 

 

生成腳本

在找到缺失索引后可以通過體檢專家自動生成腳本。執行計划中也可以類似的生成腳本。
 
 

 

 

如何建立

 
通過體檢專家可以輕松找到系統中缺失的索引。但對於系統中大量的缺失索引,我們如何去選擇呢?

1.執行計划中的缺失索引

具體的值,根據業務不同可能有些不同。但是執行次數越多,執行時間越長,影響百分比越大,就越要建立索引。我的建議是:執行次數每天超過200,執行時間超過1000ms,影響百分比超過50%。
 

2.數據庫中缺失索引

平均影響百分比越大,平均用戶開銷越大,用戶查找次數越大,那么就越需要建立。
同樣給出我的建議值:影響百分比50%,用戶開銷1,用戶查找次數每天200

 

總結

貼圖是來自北京某銀行系統。系統長時間語句非常多,嚴重影響前端用戶體驗。對系統第一輪優化,通過體檢專家建立合適的索引后,系統的整體性能提升超過50%以上。
 
 
 文章用到的 Expert FOR SQLSERVER 工具下載鏈接:http://zhuancloud.com/ReceptionViews/Install.html
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM