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計算公式】Height-balance直方圖選擇率(四)公式直方圖
- 【cbo計算公式】Frequenccy 直方圖選擇率(三)公式直方圖
- 【cbo計算公式】Join 選擇率(六)公式
- 【cbo計算公式】單表選擇率(二)公式
- CBO計算與資料型別的選擇(兼談日期、字元、數字三種型別的直方圖生成原理和使用)資料型別字元直方圖
- 深度學習(模型引數直方圖)深度學習模型直方圖
- 直方圖均衡化直方圖
- 直方圖學習直方圖
- python如何畫直方圖Python直方圖
- halcon-直方圖均衡直方圖
- 直方圖中最大矩形直方圖
- [Python影象處理] 十一.灰度直方圖概念及OpenCV繪製直方圖Python直方圖OpenCV
- OpenCV計算機視覺學習(9)——影像直方圖 & 直方圖均衡化OpenCV計算機視覺直方圖
- elasticsearch 之 histogram 直方圖聚合ElasticsearchHistogram直方圖
- Matplotlib直方圖繪製技巧直方圖
- 【影像處理】基於OpenCV實現影像直方圖的原理OpenCV直方圖
- 聊一聊MySQL的直方圖MySql直方圖
- [20221227]Adaptive Cursor Sharing & 直方圖.txtAPT直方圖
- 淺析MySQL 8.0直方圖原理MySql直方圖
- 一文搞懂直方圖均衡直方圖
- opencv——影像直方圖與反向投影OpenCV直方圖
- 【沃趣科技】直方圖系列1直方圖
- 你知道直方圖都能幹啥?直方圖
- OpenCV之影象直方圖均衡化OpenCV直方圖
- 數字影像處理讀書筆記(三)直方圖匹配筆記直方圖
- [數字影像學筆記] 4.直方圖變換2筆記直方圖
- 柱狀圖、直方圖、散點圖、餅圖講解直方圖
- 直方圖均衡化原理與實現直方圖
- 一文搞懂 Prometheus 的直方圖Prometheus直方圖
- 灰度直方圖均衡化及其實現直方圖
- matplotlib的直方圖繪製(筆記)直方圖筆記
- Python 影像處理 OpenCV (16):影像直方圖PythonOpenCV直方圖
- [20190630]如何確定直方圖型別.txt直方圖型別
- 【R語言】繪製權重直方圖R語言直方圖
- 專欄 | 基於 Jupyter 的特徵工程手冊:特徵選擇(四)特徵工程
- HC(Histogram-based Contrast) 基於直方圖對比度的顯著性HistogramAST直方圖
- 基於優先數系選擇分壓電阻
- [20190827]函式索引與選擇率.txt函式索引
- 四種CSS 複合選擇器CSS