歡迎回到性能調優教育訓練。今天我想詳細談下統計資訊在SQL Server内部是如何呈現的。假設有這樣的問題:執行計劃裡的某個運算符的估計行數是42,但你知道對于這個查詢,42不是正确的答案。但是你怎麼來解讀統計資訊來了解這個估計是從哪裡來的?我們來談論下直方圖(Histogram)和密度向量(Density Vector)。
直方圖(Histogram)
首先我們來看下直方圖。直方圖的用途是用高效、壓縮的方式存儲列資料分布情況。每次當你在表上建立索引時(聚集/非聚集索引),SQL Server會為你自動建立統計資訊。這個統計資訊就包含了那列(索引鍵)的資料分布資訊。比如你有一個訂單表,裡面有個Country列,這列裡有很多國家名字。是以直方圖就是對這些國家個數分布情況的可視化:

在直方圖裡,我們用很多柱條描述資料分布情況:柱條越高,那列的這個值就記錄數就越多。SQL Server使用同樣的概念和格式來描述資料分布情況。我們通過一個例子來詳細了解下。在AdventureWorks2008R2資料庫裡,我們找到表SalesOrderDetail裡的ProductID列。這ProductID列存儲着具體的銷售産品ID資訊。可以看到,ProductID列也有索引定義,那就說有對應的統計資訊來描述ProductID列的資料分布情況。
在SSMS裡,你通過檢視表屬性來檢視列和統計資訊,也可以使用DBCC SHOW_STATISTICS指令在結果裡輸出統計資訊。
1 -- Show the statistics for a given index
2 DBCC SHOW_STATISTICS ('Sales.SalesOrderDetail', IX_SalesOrderDetail_ProductID)
3 GO
從上圖可以看到,這個指令傳回3個不同的記錄集:
- 資料顯示标題
- 密度向量
- 直方圖
如果你想詳細了解這部分的統計資訊是如何用來做基數預估的,可以看下統計資訊内幕:直方圖和密度向量。
密度向量(Density Vector)
我們再來看看神秘的密度向量,看下非聚集索引IX_SalesOrderDetail_ProductID,這個索引隻在ProductID列建立。但是每個非聚集索引,SQL Server在索引的頁層也儲存聚集鍵作為邏輯指針。當你定義了非唯一的非聚集索引,聚集鍵也是非聚集索引導航結構的一部分。表裡的聚集鍵SalesOrderID是個組合列,包含SalesOrderID列和SalesOrderDetailID列。
這就是說我們的非唯一非聚集索引事實上包含ProductID,SalesOrderID和SalesOrderDetailID列。索引鍵是個組合鍵。同樣SQL Server需要為其他列建立密度向量,因為隻有第1列(ProductID)是直方圖裡有資訊,這個在上一部分我們已經看過了。當你看用DBCC SHOW_STATISTICS指令的輸出時,密度向量是第2個表資訊。
SQL Server在這裡存儲選擇率(selectivity),不同列組合的密度。例如,ProductID列的All density值是0.003759399,你可以用下列語句來驗證下:
1 -- The "All Density" value for the column ProductID: 0,0037593984962406015
2 SELECT 1 / CAST(COUNT(DISTINCT ProductID) AS NUMERIC(18, 2)) FROM Sales.SalesOrderDetail
3 GO
對于ProductID,SalesOrderID組合列和ProductID,SalesOrderID,SalesOrderDetailID組合列的All density值分别是8.242868E-06和8.242868E-06。你可以用1除以2個組合列的唯一值來驗證下。這裡我們的記錄是121317,這些聚集值(SalesOrderID,SalesOrderDetailID組成了聚集鍵)都是唯一的,我們可以計算下:1/121317=8.242867858585359e-6。
在基數預估期間,SQL Server如何使用這個資訊,詳細可以點選剛才提到的統計資訊内幕:直方圖和密度向量。
小結
今天你看到SQL Server内部是如何建構統計資訊的。這裡最重要的是直方圖(Histogram)和密度向量(Density Vector),它們一直是用來做基數預估的。希望這次性能調優教育訓練你有所收獲。
你可以閱讀下面文章,加深對統計資訊的了解:
了解統計資訊(1/6):密度向量
了解統計資訊(2/6):直方圖
了解統計資訊(3/6):誰建立和管理統計資訊?在性能調優中,統計資訊的作用
了解統計資訊(4/6):自動更新統計資訊的閥值——人為更新統計資訊的重要性
了解統計資訊(5/6):如何檢測過期的統計資訊
了解統計資訊(6/6):統計資訊彙總貼
統計資訊内幕:直方圖和密度向量
下周我們繼續讨論在SQL Server裡使用基數預估(cardinality estimation)的局限性,還有如何解決它們。到時候見!
圍觀PPT:
0824_14直方圖和密度向量.rar
注:此文章為
WoodyTu學習MS SQL技術,收集整理相關文檔撰寫,歡迎轉載,請在文章頁面明顯位置給出此文連結!
若您覺得這篇文章還不錯請點選下右下角的推薦,有了您的支援才能激發作者更大的寫作熱情,非常感謝!