在理解統計信息(1/6):密度向量里,我們討論了在統計里存儲的密度向量信息。這篇文章會討論下直方圖。我們再次創建SalesOrderDetail表的副本,并在上面建立2個索引。
1 USE StatisticsDB2 GO3 SELECT * INTO SalesOrderDetail FROM AdventureWorks2008r2.Sales.SalesOrderDetail4 CREATE UNIQUE CLUSTERED INDEX ix_SalesOrderDetailID ON SalesOrderDetail(SalesOrderDetailID)5 CREATE NONCLUSTERED INDEX ix_PRoductid ON SalesOrderDetail(productid)
我們來看看非聚集索引的直方圖信息。
1 DBCC SHOW_STATISTICS('dbo.SalesOrderDetail', 'ix_productid') WITH HISTOGRAM
你會在輸出里看到200條記錄,上圖只顯示了前18條記錄。為了創建直方圖,SQL Server基于索引的第一列值把數據分成不同的桶(步長)。輸出結果里每條記錄被稱為步長?;跀祿植记闆r,步長的最大個數是200。直方圖是你數據的統計表述(statistical representation)。換句話說,它是基于索引的第一列值的數據分布情況。直方圖總是基于索引的第一列,即使索引是組合列。這也是為什么建議把經常被選到的列(most selective column)作為索引的第一列的原因,但也有例外。我們來看直方圖的輸出結果。它是基于productid值把表里121317條記錄分成200個桶(步長)。
RANGE_HI_KEY列表示每桶的上邊界值。每桶的下邊界值是上一桶的RANGE_HI_KEY+1。對于第一桶,下邊界值是生成直方圖列的最小值。
RANGE_ROWS列表示在那桶范圍內的記錄數,但不等于RANGE_HI_KEY值。第一條記錄的0值標識,在整個表里沒有一條記錄productid值是小于707的。我們來看第11條記錄,它的RANGE_HI_KEY值是718,RANGE_ROWS列值是218。這就是說,有218條記錄的productid是大于716(上一條RANGE_HI_KEY值)且小于718的。我們可以去驗證下。
1 SELECT COUNT(*) FROM SalesOrderDetail WHERE productid>716 AND productid<718
EQ_ROWS列表示表里與RANGE_HI_KEY值匹配的記錄數。對于第一條記錄,EQ_ROWS值為3083表示表里productid值為707的記錄有3083條。我們可以驗證下。
1 SELECT COUNT(*) FROM SalesOrderDetail WHERE productid=707
DISTINCT_RANGE_ROWS列表示在2個RANGE_HI_KEY值之間的不同記錄數(不同productid值)。我們來看第11條的RANGE_HI_KEY值是718,DISTINCT_RANGE_ROWS列值為1,這就是說productid值大于716(上一個RANGE_HI_KEY值)且小于718只有1條不同記錄。我們可以驗證下。
1 SELECT COUNT(distinct productid) FROM SalesOrderDetail WHERE productid>716 AND productid<718
AVG_RANGE_ROWS列表示每個不同值的平均記錄數。如果AVG_RANGE_ROWS值大于0的話,和RANGE_ROWS / DISTINCT_RANGE_ROWS相等,不然AVG_RANGE_ROWS的值為1。
SQL Server優化器如何使用直方圖來做基數計算(cardinality estimation)呢?我們看下下面查詢的執行計劃,點擊工具欄的顯示包含實際的執行計劃。
1 SELECT productid FROM SalesOrderDetail WHERE productid>=716 AND productid<=718
估計行數1513是怎么計算來的呢?我們看下直方圖。
紅色方框里的數字合計(1076+218+219=1513)就是執行計劃里估計行數值。
1076是productid值為716的記錄數。
218是productid值大于716且小于718的記錄數。
219是productid值等于718的記錄數。
三個值的匯總就是上述執行計劃里的估計行數。
當where條件復雜時,優化器會創建稱為列統計的統計信息,并在直方圖數據上使用復合算法(complexalgorithm)進行基數計算(cardinality estimation)。我們在下篇文章會談論這個的更多細節。
新聞熱點
疑難解答