【DB筆試面試634】在Oracle中,什麼是直方圖(Histogram)?直方圖的使用場合有哪些?

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

♣          題目         部分

在Oracle中,什麼是直方圖(Histogram)?直方圖的使用場合有哪些?面試


     
♣          答案部分          



直方圖是CBO中的一個重點,也是一個難點部分,在面試中經常被問到。數據庫

(一)直方圖的意義ide

在Oracle數據庫中,CBO會默認認爲目標列的數據在其最小值(LOW_VALUE)和最大值(HIGH_VALUE)之間是均勻分佈的,而且會按照這個均勻分佈原則來計算對目標列施加WHERE查詢條件後的可選擇率以及結果集的Cardinality,進而據此來計算成本值並選擇執行計劃。可是,目標列的數據是均勻分佈這個原則並不老是正確的,在實際的生產系統中,有不少表的列的數據分佈是不均勻的,甚至是極度傾斜、分佈極度不均衡的。對這樣的列若是還按照均勻分佈的原則去計算可選擇率與Cardinality,並據此來計算成本、選擇執行計劃,那麼CBO所選擇的執行計劃就極可能是不合理的,甚至是錯誤的,因此,此時應該收集列的直方圖。優化

直方圖是一種列的特殊的統計信息,主要用來描述列上的數據分佈狀況。當數據分佈傾斜時,直方圖能夠有效地提高Cardinality評估的準確度。構造直方圖最主要的緣由就是幫助優化器在表中數據嚴重偏斜時作出更好的規劃。例如,表中的某個列上,其中的某個值佔據了數據行的80%(數據分佈傾斜),相關的索引就可能沒法幫助減小知足查詢所需的I/O數量。建立直方圖可讓基於成本的優化器知道什麼時候使用索引才最合適,或什麼時候應該根據WHERE子句中的值返回表中80%的記錄。若是對目標列收集了直方圖,那麼意味着CBO將再也不認爲該目標列上的數據是均勻分佈的了,CBO就會用該目標列上的直方圖統計信息來計算對該列施加查詢條件後的可選擇率和返回結果集的Cardinality,進而據此計算成本並選擇相應的執行計劃。spa

直方圖實際上存儲在數據字典基表SYS.HISTGRM$中,能夠經過數據字典DBA_TAB_HISTOGRAMS、DBA_PART_HISTOGRAMS和DBA_SUBPART_HISTOGRAMS來分別查看錶、分區表的分區和分區表的子分區的直方圖統計信息。blog

(二)直方圖的使用場合索引

一般狀況下在如下場合中建議使用直方圖:it

(1)當WHERE子句引用了列值分佈存在明顯誤差的列時:當這種誤差至關明顯時,以致於WHERE子句中的值將會使優化器選擇不一樣的執行計劃。這時應該使用直方圖來幫助優化器來修正執行路徑。(注意:若查詢不引用該列,則在該列上建立直方圖沒有意義)。class

(2)當列值致使不正確的判斷時,這種狀況一般會發生在多表鏈接時。例如,假設有一個五張表的鏈接操做,其目標SQL最終結果集只有10行。Oracle將會以一種使第一個鏈接的結果集(集合基數)儘量小的方式將錶鏈接起來。經過在中間結果集中攜帶更少的負載,查詢將會運行得更快。爲了使中間結果最小化,優化器嘗試在SQL執行的分析階段評估每一個結果集的集合基數。在誤差的列上擁有直方圖將會極大地幫助優化器做出正確的決策。如優化器對中間結果集的大小做出不正確的判斷,則它可能會選擇一種未達到最優化的錶鏈接方法。所以向該列添加直方圖常常會向優化器提供使用最佳鏈接方法所需的信息。引用

相關文章
相關標籤/搜索