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