cbo心得(選擇率,基數,直方圖)(四)
為了更明顯的說明直方圖的作用,我修改一下上面的建立的表,進一步的增加列ID的傾斜性。
SQL> drop table sunwg purge;
表已刪除。
SQL> create table sunwg (id number);
表已建立。
SQL> create index ind_sunwg on sunwg(id);
索引已建立。
SQL> insert into sunwg select 1 from dba_objects where rownum < 4000;
已建立3999行。
SQL> insert into sunwg select rownum from dba_objects where rownum < 2002;
已建立4001行。
SQL> commit;
在表SUNWG中ID = 1的記錄一共有4000條,佔了全部記錄的66%。
分析表和索引,並且統計直方圖資訊。
SQL> analyze table sunwg compute statistics for table for all indexes for column
s id size 10;
表已分析。
還是執行前面的那兩個SQL看看有了直方圖資訊之後的效果。
SQL> select * from sunwg where id = 50;
執行計劃
----------------------------------------------------------
Plan hash value: 3109917279
---------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 3 | 1 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| IND_SUNWG | 1 | 3 | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("ID"=50)
因為ID = 50的記錄在表SUNWG中僅有一條,所以才用索引範圍掃描的效率會更好一些。CBO選擇了高效的執行方式。
SQL> select * from sunwg where id = 1;
執行計劃
----------------------------------------------------------
Plan hash value: 650063079
---------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
---------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 3600 | 10800 | 5 (0)|
|* 1 | INDEX FAST FULL SCAN| IND_SUNWG | 3600 | 10800 | 5 (0)| 00:00:01
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("ID"=1)
在ID = 1的時候,CBO選擇了執行快速索引全掃描。ORACLE意識到了ID = 1的時候結果集的變化,所以CBO沒有采用索引範圍掃描,而是選擇了更加高效的快速索引全掃描。
結合前面的例子,我們可以知道對於那些嚴重傾斜的列來說,直方圖資訊是多麼的重要。所以我們在收集統計資訊的時候,一定不要忽略了直方圖這個重要的因素。下面是存在直方圖資訊時,其他謂詞的情況:
Where 條件 | Oracle估計記錄數 | 表中實際記錄數 | Oracle估算公式(猜想) |
ID = 1 | 3600 | 4000 | |
ID > 1 | 2400 | 2000 | |
ID >= 1 | 6000 | 6000 | |
ID = 110 | 1 | 0 | 1<= X<= 6000 * DENSITY |
ID + 1 > 1 | 300 | 6000 | 6000* 5% |
ID + 1 >= 1 | 300 | 6000 | 6000* 5% |
ID + 1 > 1 AND ID + 1 > 1 | 300 | 6000 | 6000* 5% |
ID > 1 AND ID < 50 | 147 | 48 | |
ID >= 1 AND ID <= 50 | 3747 | 4049 |
這次ORACLE估算公式一欄很多都是空著的。因為在存在直方圖資訊的時候,計算Rows的演算法特別的複雜。我下面會詳細的介紹一下這部分內容。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9533994/viewspace-1008780/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- cbo心得(選擇率,基數,直方圖)(一)直方圖
- cbo心得(選擇率,基數,直方圖)(二)直方圖
- cbo心得(選擇率,基數,直方圖)(三)直方圖
- cbo心得(選擇率,基數,直方圖)(五)直方圖
- 【cbo計算公式】Height-balance直方圖選擇率(四)公式直方圖
- 【cbo計算公式】Frequenccy 直方圖選擇率(三)公式直方圖
- 直方圖、基數、選擇性、群集因子直方圖
- CBO中基數(cardinality)、可選擇率(selectivity)的計算公式公式
- 【cbo計算公式】Join 選擇率(六)公式
- 【cbo計算公式】單表選擇率(二)公式
- 蛋疼的CBO等高直方圖演算法直方圖演算法
- 基於CBO優化器謂詞選擇率的計算方法優化
- CBO計算與資料型別的選擇(兼談日期、字元、數字三種型別的直方圖生成原理和使用)資料型別字元直方圖
- 基於CBO最佳化器謂詞選擇率的計算方法
- 選擇率(selectivity)與基數(cardinality)
- 【數字影象處理】四.MFC對話方塊繪製灰度直方圖直方圖
- 直方圖直方圖
- 收集直方圖及檢視直方圖資訊直方圖
- 關於高度均衡和頻率均衡的直方圖直方圖
- 深度學習(模型引數直方圖)深度學習模型直方圖
- 【調優】CBO基礎(四)
- 直方圖(histograms)直方圖Histogram
- 7.3 直方圖直方圖
- oracle 直方圖Oracle直方圖
- 直方圖均衡化直方圖
- 04:垂直直方圖直方圖
- oracle直方圖使用Oracle直方圖
- 直方圖學習直方圖
- Oracle直方圖解析Oracle直方圖圖解
- [zt] Histograms - 直方圖Histogram直方圖
- dba_histograms等高直方圖和等頻直方圖的理解Histogram直方圖
- [20170615]直方圖-高度直方圖(11g).txt直方圖
- 直方圖中最大矩形直方圖
- Oracle直方圖詳解Oracle直方圖
- 【效能優化】直方圖優化直方圖
- MATLAB實現頻數直方圖——hist的使用Matlab直方圖
- oracle實驗記錄 (oracle單表選擇率與基數計算(1))Oracle
- oracle實驗記錄 (oracle單表選擇率與基數計算(2))Oracle