SQL Server索引直方圖描述
以下的文章主要向大家講述的是SQL Server索引直方圖(The Statistics Histogram),在直方圖中,其至多可存儲200個樣本值。每個樣本被稱為一個step。保存在每個step中樣本值是值的范圍的端點。每個step保存了3個值,分別描述為:
EQ_ROWS——與樣本值相同的行數。換句話就是該step中重復值的個數。
RANG_ROWS——表示除了當前值外,介于當前step和前一個step之間其他值的行數。
Rang Density——表示在該范圍內有多少個不同的值。范圍密度信息實際上有兩個單獨的列組成,分別為:DISTINCT_RANGE_ROWS 和AVG_RANG_ROWS。
DISTINCT_RANGE_ROWS表示除了當前值外,當前step與前一個step之間具有多少個不同值的個數。
AVG_RANGE_ROWS在該step范圍內,每個不同值的平均行數。
在listing34.1的輸出中,SQL Server索引直方圖中第一列的所有不同鍵值的值作為樣本值存儲在直方圖中,所以,直方圖中的樣本值之間沒有值(RANG_ROWS),其后所有的范圍值為0。你可能注意到在last name 為Ringer的索引鍵值上有一個重復值(EQ_ROWS = 2)。為了更好比較,Listing34.2顯示了bigpubs2000數據庫中的sales表的DBCC SHOW_STATISTICS信息片段。
- Listing 34.2 DBCC SHOW_STATISTICS Output for the titleidind Index on the sales Table in the bigpubs2000 Database
- Statistics for INDEX 'titleidind'.
- Updated Rows Rows Sampled Steps Density Average key length
- Aug 21 2001 11:18PM 168725 168725 200 1.8955356E-3 26.405577
- (1 row(s) affected)
- All density Average Length Columns
- 1.8621974E-3 6.0 title_id
- 5.997505E-6 10.0 title_id, stor_id
- 5.9268041E-6 26.405577 title_id, stor_id, ord_num
- (3 row(s) affected)
- RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
- BI0194 0.0 314.0 0 0.0
- BI2184 613.0 343.0 2 306.5
- BI2574 270.0 277.0 1 270.0
- BI3224 618.0 286.0 2 309.0
- BI3976 311.0 293.0 1 311.0
- BI6450 673.0 300.0 2 336.5
- BI9506 947.0 292.0 3 315.66666
- BU1111 296.0 299.0 1 296.0
- BU7832 349.0 334.0 1 349.0
- CH0249 1011.0 311.0 3 337.0
- CH0639 984.0 307.0 3 328.0
- ...
- TC4203 0.0 321.0 0 0.0
- TC7777 0.0 297.0 0 0.0
- (200 row(s) affected)
從這個例子你可以看出,每個范圍內有更多的值(RANG_ROWS),并且每個step中包含了更多的重復值(EQ_ROWS)。另外,直方圖中的所有200行都被使用了,表中的168,725行記錄分布在這些200行中。所有的168,725行都被用來生成統(tǒng)計信息(Rows Sampled)。
只有當一個常量表達式與索引列進行比較時,并且常量表達式的值在查詢編譯時是已知時,SARG的計算才能使用直方圖的step值。直方圖中的step可以為SARG使用的的例子包括:
- Where col_a = getddate()
- Where cust_id = 12345
- Where monthly_sales < 10000 /12
- Where l_name like "Smith" + "%"
有些常量表達式的直到查詢運行時才能計算出來。這些查詢參數中包含了局部變量或者子查詢:
- Where price = @avg_price
- Where total_sales > (select sum(qty) from sales)
- Where titles.pub_id = publishers_id
對于這些類型的表達式,你需要其他方法來估計匹配的行數。另外,因為直方圖steps只記錄了索引中第一列的值,當需要評估組合索引的多列的SARG匹配的行數時,SQL Server必須使用不同方法來決定,例如下面:
- Select * from sales
- Where title_id = 'BI3976'
- And stor_id = 'p648'
當直方圖沒有被使用或者不能使用時,SQL Server使用索引密度值來估計匹配的行數,以上的相關內容就是對SQL Server索引直方圖(The Statistics Histogram)的介紹,望你能有所收獲。
【編輯推薦】
- 創(chuàng)建SQL Server數據庫更是實在
- SQL Server創(chuàng)建表所要用到的代碼
- SQL Server創(chuàng)建約束的代碼運用
- 實現SQL Server創(chuàng)建事務要用到的代碼
- 優(yōu)化SQL Server數據庫的經驗大盤點