等頻直方圖,計算COST
--------------資料庫版本
SQL> select * from v$version where rownum=1;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
---------------表中資料分佈
SQL> select count(*),id from wxh_tbd group by id;
COUNT(*) ID
------------------------------ ------------------------------
398663 100000
49834 10
---------------收集直方圖資訊
begin
dbms_stats.gather_table_stats(ownname => 'scott',
tabname => 'wxh_tbd',
no_invalidate => FALSE,
estimate_percent => 100,
method_opt => 'for all columns size skewonly',
cascade => true);
end;
/
SQL> SELECT column_name,endpoint_number,endpoint_value FROM USER_HISTOGRAMS WHERE TABLE_NAME='WXH_TBD';
COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ --------------- --------------
ID 49834 10
ID 448497 100000
--------------在ID列上建立索引
create index t_d on wxh_tbd(id);
--------------執行查詢
SQL> select /*+ index(wxh_tbd t_d) */count(*) from wxh_tbd where id=10;
COUNT(*)
------------------------------
49834
執行計劃
----------------------------------------------------------
Plan hash value: 485739739
----------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
----------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 | 100 |
| 1 | SORT AGGREGATE | | 1 | 3 | |
|* 2 | INDEX RANGE SCAN| T_D | 49834 | 145K| 100 |
----------------------------------------------------------
可以看出COST是100
本例中索引的LEVEL 是2
索引頁塊數量是857.
表總行數是448497
根據索引COST公式
COST=blevel +ceiling(leaf_blocks * effective index selectivity)
=2+ceiling(857*effective index selectivity)
關鍵是看這個effective index selectivity怎麼計算。
在列沒有直方圖的情況下,一般等於1/num_distinct
如果謂詞列存在直方圖,就不能採取1/num_distinct了。
我查了好多資料,都沒查到演算法,CBO書裡也沒給出具體的公式。可能是他覺得太簡單了?
那麼猜一下。既然直方圖都把對應列的頻率統計出來了,那麼拿這個頻率除以總行數,不就是選擇率嗎?
驗證下
SQL> select ceil((49834/448497)*875)+2 from dual;
CEIL((49834/448497)*875)+2
--------------------------
100
果然不出所料。
[ 本帖最後由 wei-xh 於 2011-5-14 14:58 編輯 ]
SQL> select * from v$version where rownum=1;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
---------------表中資料分佈
SQL> select count(*),id from wxh_tbd group by id;
COUNT(*) ID
------------------------------ ------------------------------
398663 100000
49834 10
---------------收集直方圖資訊
begin
dbms_stats.gather_table_stats(ownname => 'scott',
tabname => 'wxh_tbd',
no_invalidate => FALSE,
estimate_percent => 100,
method_opt => 'for all columns size skewonly',
cascade => true);
end;
/
SQL> SELECT column_name,endpoint_number,endpoint_value FROM USER_HISTOGRAMS WHERE TABLE_NAME='WXH_TBD';
COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ --------------- --------------
ID 49834 10
ID 448497 100000
--------------在ID列上建立索引
create index t_d on wxh_tbd(id);
--------------執行查詢
SQL> select /*+ index(wxh_tbd t_d) */count(*) from wxh_tbd where id=10;
COUNT(*)
------------------------------
49834
執行計劃
----------------------------------------------------------
Plan hash value: 485739739
----------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
----------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 | 100 |
| 1 | SORT AGGREGATE | | 1 | 3 | |
|* 2 | INDEX RANGE SCAN| T_D | 49834 | 145K| 100 |
----------------------------------------------------------
可以看出COST是100
本例中索引的LEVEL 是2
索引頁塊數量是857.
表總行數是448497
根據索引COST公式
COST=blevel +ceiling(leaf_blocks * effective index selectivity)
=2+ceiling(857*effective index selectivity)
關鍵是看這個effective index selectivity怎麼計算。
在列沒有直方圖的情況下,一般等於1/num_distinct
如果謂詞列存在直方圖,就不能採取1/num_distinct了。
我查了好多資料,都沒查到演算法,CBO書裡也沒給出具體的公式。可能是他覺得太簡單了?
那麼猜一下。既然直方圖都把對應列的頻率統計出來了,那麼拿這個頻率除以總行數,不就是選擇率嗎?
驗證下
SQL> select ceil((49834/448497)*875)+2 from dual;
CEIL((49834/448497)*875)+2
--------------------------
100
果然不出所料。
[ 本帖最後由 wei-xh 於 2011-5-14 14:58 編輯 ]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22034023/viewspace-695365/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- OpenCV計算機視覺學習(9)——影像直方圖 & 直方圖均衡化OpenCV計算機視覺直方圖
- 【cbo計算公式】Frequenccy 直方圖選擇率(三)公式直方圖
- Javafx-【直方圖】文字頻次統計工具 中文/英文單詞統計Java直方圖
- 【cbo計算公式】Height-balance直方圖選擇率(四)公式直方圖
- 直方圖均衡化直方圖
- 直方圖學習直方圖
- python如何畫直方圖Python直方圖
- halcon-直方圖均衡直方圖
- 直方圖中最大矩形直方圖
- [Python影象處理] 十一.灰度直方圖概念及OpenCV繪製直方圖Python直方圖OpenCV
- MySQL8.0 · 最佳化器新特性 · Cost Model, 直方圖及最佳化器開銷最佳化MySql直方圖
- elasticsearch 之 histogram 直方圖聚合ElasticsearchHistogram直方圖
- Matplotlib直方圖繪製技巧直方圖
- 聊一聊MySQL的直方圖MySql直方圖
- [20221227]Adaptive Cursor Sharing & 直方圖.txtAPT直方圖
- 淺析MySQL 8.0直方圖原理MySql直方圖
- 一文搞懂直方圖均衡直方圖
- opencv——影像直方圖與反向投影OpenCV直方圖
- 【沃趣科技】直方圖系列1直方圖
- 你知道直方圖都能幹啥?直方圖
- OpenCV之影象直方圖均衡化OpenCV直方圖
- 關於定時器週期、頻率等相關計算定時器
- 柱狀圖、直方圖、散點圖、餅圖講解直方圖
- 深度學習(模型引數直方圖)深度學習模型直方圖
- 直方圖均衡化原理與實現直方圖
- 一文搞懂 Prometheus 的直方圖Prometheus直方圖
- 灰度直方圖均衡化及其實現直方圖
- matplotlib的直方圖繪製(筆記)直方圖筆記
- Python 影像處理 OpenCV (16):影像直方圖PythonOpenCV直方圖
- [20190630]如何確定直方圖型別.txt直方圖型別
- 【R語言】繪製權重直方圖R語言直方圖
- search(13)- elastic4s-histograms:聚合直方圖ASTHistogram直方圖
- Python繪製直方圖 Pygal模擬擲骰子Python直方圖
- python 資料視覺化:直方圖、核密度估計圖、箱線圖、累積分佈函式圖Python視覺化直方圖函式
- 計算匯流排頻寬
- 等精度頻率計的設計與驗證
- leetcode:求直方圖構成的矩形最大面積LeetCode直方圖
- 影像演算法之直方圖均衡化(灰度影像)演算法直方圖
- 【16位RAW影像處理三】直方圖均衡化及區域性直方圖均衡用於16點陣圖像的細節增強。直方圖