histogram是oracle为cbo提供更精确的成本估计而设计的一种直方图数据。histogram能提供列的数据分布,每次分析表后列的分布信息将会被保存在统计表里面,分析时默认的histogram size是75,意思就是采用75个buckets来表示数据分布。
histogram分为2种类型,基于高度的histogram和基于值的histogram

基于高度的histogram
当histogram buckets的数量少于列的distinct value时,oracle会采用基于高度的直方图反映数据分布,每个bucket容纳相同数量的值。
基本格式如下所示

SQL>  column column_name format a20;
SQL>  column ENDPOINT_ACTUAL_VALUE format a20;
SQL> SELECT COLUMN_NAME,ENDPOINT_NUMBER, ENDPOINT_VALUE,ENDPOINT_ACTUAL_VALUE
  2       FROM DBA_HISTOGRAMS
  3       WHERE TABLE_NAME ='TEST' AND COLUMN_NAME='OBJECT_ID'
  4       ORDER BY ENDPOINT_NUMBER;
COLUMN_NAME          ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_ACTUAL_VALU
-------------------- --------------- -------------- --------------------
OBJECT_ID                         29              1
OBJECT_ID                         44              2
OBJECT_ID                         59              3
OBJECT_ID                         74              4
OBJECT_ID                         75             76

这里'OBJECT_ID'列有从1到76不同的76个值,bucket数量为75个,所以采取了基于高度的直方图。
可以看到1的值占据了1-29号bucket,2的值占据了30-44号bucket,3的值占据了45-59号bucket,4的值占据了60-74号bucket,值5-76占据了75号bucket。所以值1占的比例最大。

基于值的histogram
当histogram buckets>=列的distinct values时,那么Oracle会使用基于值的histogram,每个值将会占据一个bucket,来看一下

SQL>  column column_name format a20;
SQL>  column ENDPOINT_ACTUAL_VALUE format a20;
SQL> SELECT COLUMN_NAME,ENDPOINT_NUMBER, ENDPOINT_VALUE,ENDPOINT_ACTUAL_VALUE
  2       FROM DBA_HISTOGRAMS
  3       WHERE TABLE_NAME ='TEST' AND COLUMN_NAME='OBJECT_ID'
  4       ORDER BY ENDPOINT_NUMBER;
COLUMN_NAME          ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_ACTUAL_VALU
-------------------- --------------- -------------- --------------------
OBJECT_ID                      19928              1
OBJECT_ID                      29927              2
OBJECT_ID                      39926              3
OBJECT_ID                      49838              4
OBJECT_ID                      49839              5
OBJECT_ID                      49840              6
OBJECT_ID                      49841              7
OBJECT_ID                      49842              8
OBJECT_ID                      49843              9
OBJECT_ID                      49844             10
OBJECT_ID                      49845             11
OBJECT_ID                      49846             12
OBJECT_ID                      49847             13
OBJECT_ID                      49848             14
OBJECT_ID                      49849             15
OBJECT_ID                      49850             16
OBJECT_ID                      49851             17
OBJECT_ID                      49852             18
OBJECT_ID                      49853             19
OBJECT_ID                      49854             20
OBJECT_ID                      49855             21
OBJECT_ID                      49856             22
OBJECT_ID                      49857             23
OBJECT_ID                      49858             24
OBJECT_ID                      49859             25
OBJECT_ID                      49860             26
OBJECT_ID                      49861             27
OBJECT_ID                      49862             28
OBJECT_ID                      49863             29
OBJECT_ID                      49864             30
OBJECT_ID                      49865             31
OBJECT_ID                      49866             32
OBJECT_ID                      49867             33
OBJECT_ID                      49868             34
OBJECT_ID                      49869             35
OBJECT_ID                      49870             36
OBJECT_ID                      49871             37
OBJECT_ID                      49872             38
OBJECT_ID                      49873             39
OBJECT_ID                      49874             40
OBJECT_ID                      49875             41
OBJECT_ID                      49876             42
OBJECT_ID                      49877             43
OBJECT_ID                      49878             44
OBJECT_ID                      49879             45
OBJECT_ID                      49880             46
OBJECT_ID                      49881             47
OBJECT_ID                      49882             48
OBJECT_ID                      49883             49
OBJECT_ID                      49884             50
OBJECT_ID                      49885             51
OBJECT_ID                      49886             52
OBJECT_ID                      49887             53
OBJECT_ID                      49888             54
OBJECT_ID                      49889             55
OBJECT_ID                      49890             56
OBJECT_ID                      49891             57
OBJECT_ID                      49892             58
OBJECT_ID                      49893             59
OBJECT_ID                      49894             60
OBJECT_ID                      49895             61
OBJECT_ID                      49896             62
OBJECT_ID                      49897             63
OBJECT_ID                      49898             64
OBJECT_ID                      49899             65
OBJECT_ID                      49900             66
OBJECT_ID                      49901             67
OBJECT_ID                      49902             68
OBJECT_ID                      49903             69
OBJECT_ID                      49904             70
OBJECT_ID                      49905             71
OBJECT_ID                      49906             72
OBJECT_ID                      49907             73
OBJECT_ID                      49908             74
OBJECT_ID                      49909             75

很明显可以看出与基于高度的histogram的区别,基于值的histogram为每一个值提供了一个bucket,从上面看到值1有19928行,值2有9999行,值3有9999行,值4有9912行,值5-75都分别只有1行,同样我们可以看出值1占的比例最大。

直方图的数据我们也看到了,但cbo怎么利用它来计算成本呢,做个10053看一下

alter session set events'10053 trace name context forever,level 1';
select object_name from test where object_id=1;
alter session set events'10053 trace name context off';

提取trace文件中的一段
***************************************
BASE STATISTICAL INFORMATION
***********************
Table Stats::
  Table: TEST  Alias: TEST
    #Rows: 49909  #Blks:  707  AvgRowLen:  95.00
Index Stats::
  Index: IND_TEST_OBJECT_ID  Col#: 4
    LVLS: 1  #LB: 179  #DK: 5  LB/K: 35.00  DB/K: 175.00  CLUF: 879.00
***************************************
SINGLE TABLE ACCESS PATH
  Column (#4): OBJECT_ID(NUMBER)
    AvgLen: 2.00 NDV: 75 Nulls: 0 Density: 1.0018e-05 Min: 1 Max: 75
    Histogram: Freq  #Bkts: 75  UncompBkts: 49909  EndPtVals: 75
  Table: TEST  Alias: TEST     
    Card: Original: 49909  Rounded: 19928  Computed: 19928.00  Non Adjusted: 19928.00
  Access Path: TableScan
    Cost:  158.56  Resp: 158.56  Degree: 0
      Cost_io: 156.00  Cost_cpu: 18011198
      Resp_io: 156.00  Resp_cpu: 18011198
  Access Path: index (AllEqRange)
    Index: IND_TEST_OBJECT_ID
    resc_io: 423.00  resc_cpu: 11183699
    ix_sel: 0.39929  ix_sel_with_filters: 0.39929
    Cost: 424.59  Resp: 424.59  Degree: 1
  Best:: AccessPath: TableScan
         Cost: 158.56  Degree: 1  Resp: 158.56  Card: 19928.00  Bytes: 0

上面的selectivity就是通过histogram来计算的,如果不存在histogram的话那么selectivity=(1/number of distinct values),这里的selectivity=(值为1的行数/总行数)=(19928/49909)=0.39929
再根据索引扫描成本计算公式
io_cost=resc_io= blevel+FF*leaf_blocks+FF*clustering_factor
=1+0.39929*179+0.39929*879
=1+71.47291+350.97591
=423

所以index访问成本大于table scan成本,最终cbo选择的路线为采用tablescan.

如果选择object_id=75呢?

alter session set events'10053 trace name context forever,level 1';
select object_name from test where object_id=75;
alter session set events'10053 trace name context off';

***************************************
BASE STATISTICAL INFORMATION
***********************
Table Stats::
  Table: TEST  Alias: TEST
    #Rows: 49909  #Blks:  707  AvgRowLen:  95.00
Index Stats::
  Index: IND_TEST_OBJECT_ID  Col#: 4
    LVLS: 1  #LB: 179  #DK: 75  LB/K: 2.00  DB/K: 11.00  CLUF: 879.00
***************************************
SINGLE TABLE ACCESS PATH
  Column (#4): OBJECT_ID(NUMBER)
    AvgLen: 2.00 NDV: 75 Nulls: 0 Density: 1.0018e-05 Min: 1 Max: 75
    Histogram: Freq  #Bkts: 75  UncompBkts: 49909  EndPtVals: 75
  Table: TEST  Alias: TEST     
    Card: Original: 49909  Rounded: 1  Computed: 0.50  Non Adjusted: 0.50
  Access Path: TableScan
    Cost:  158.56  Resp: 158.56  Degree: 0
      Cost_io: 156.00  Cost_cpu: 18011198
      Resp_io: 156.00  Resp_cpu: 18011198
  Access Path: index (AllEqRange)
    Index: IND_TEST_OBJECT_ID
    resc_io: 2.00  resc_cpu: 15503
    ix_sel: 1.0018e-05  ix_sel_with_filters: 1.0018e-05
    Cost: 2.00  Resp: 2.00  Degree: 1
  Best:: AccessPath: IndexRange  Index: IND_TEST_OBJECT_ID
         Cost: 2.00  Degree: 1  Resp: 2.00  Card: 0.50  Bytes: 0

对于non-popular value(数量比较少的值,比如在基于高度histogram里跨度不超过一个bucket或在基于值的histogram里行数比较少的值),oracle采取了不再去计算selectivity,而是采用density来做为
做为selectivity,从HIST_HEAD$里可以看到density,oracle采用density function(密度函数)来估计列的密度。
SQL> select OBJ#,COL#,BUCKET_CNT,ROW_CNT,SAMPLE_SIZE,MINIMUM,MAXIMUM,DISTCNT,DENSITY from sys.HIST_HEAD$ where obj#=51933 AND COL#=4;
      OBJ#       COL# BUCKET_CNT    ROW_CNT SAMPLE_SIZE    MINIMUM    MAXIMUM    DISTCNT    DENSITY
---------- ---------- ---------- ---------- ----------- ---------- ---------- ---------- ----------
     51933          4      49909         75       49909          1         75         75 .000010018

io_cost=resc_io= blevel+FF*leaf_blocks+FF*clustering_factor
=1+1.0018e-05*179+1.0018e-05*879
=1+0.001793222+0.008805822
=2(因为最少会读2个块)

所以最后cbo选择了index scan。

这篇文章的目的是为了给需要的人一点提示,希望有兴趣的人能够举一反三。

关于10053可以参考
[url]http://www.**.org/post.php?action=edit&id=3&tid=44302&pid=293528&page=1[/url]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20945761/viewspace-584578/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20945761/viewspace-584578/

histogram与10053(zz)相关推荐

  1. [20170603]12c Top Frequency histogram.txt

    ---恢复内容开始--- [20170603]12c Top Frequency histogram.txt --//个人对直方图了解很少,以前2种直方图类型对于目前的许多应用来讲已经足够,或者讲遇到 ...

  2. 【性能优化】 之 10053 事件

    1.验证全表扫描的成本计算公式,贴出执行计划和计算公式.<br> 2.给出B-tree索引 Unique scan的成本计算公式,贴出执行计划和计算公式.<br> 3.通过10 ...

  3. dodo:人脸识别方法个人见解(zz from prfans)

    : dodo:人脸识别方法个人见解(zz from prfans) 发信站: 水木社区 (Tue Jul 10 14:00:00 2007), 站内 http://prfans.com/forum/r ...

  4. 当统计信息不准确时,CBO可能产生错误的执行计划,并在10053 trace中找到CBO出错的位置示例...

    一.本文说明: 操作系统:rhel 5.4 x32 数据库:oracle 11g r2 x32 二.实验内容: ----创建一张jack表,并创建索引jack_ind---- 1 SQL> cr ...

  5. poj 2559 Largest Rectangle in a Histogram 栈

    // poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的 ...

  6. CUDA Samples: Calculate Histogram(atomicAdd)

    以下CUDA sample是分别用C++和CUDA实现的计算一维直方图,并对其中使用到的CUDA函数进行了解说,code参考了<GPU高性能编程CUDA实战>一书的第九章,各个文件内容如下 ...

  7. LoadRunner Winsock 10053错误的真正原因

    最近使用LoadRunner进行Winsock协议的性能测试时,测试的WebServer是JBoss,经常出现10053错误,现象如下:当我用lrs_create_socket创建连接之后,当这个so ...

  8. mysql报错代码10051_socket error 10061/11004/10053/10051等错误总结

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单 ...

  9. zw版【转发·台湾nvp系列Delphi例程】HALCON Histogram

    zw版[转发·台湾nvp系列Delphi例程]HALCON Histogram unit Unit1; interface uses Windows, Messages, SysUtils, Vari ...

最新文章

  1. 谷歌CEO皮猜致歉,被解雇的AI伦理研究员:根本没有认错
  2. but no declaration can be found for element #39;aop:aspectj-autoproxy#39;.
  3. 控制好你的 Wordpress 侧边栏
  4. wxss 点击样式_微信小程序点击控件修改样式实例详解
  5. CSS3动画详解(图文教程)
  6. python可视化图表工具_酷炫的可视化图表工具来帮忙 深度评测五大Python数据可视化工具...
  7. python自动截图发送邮件_PhantomJS按尺寸截取页面,并用python发送邮件
  8. java数组更新_java刷新数组到jList
  9. C#驱动级模拟按键操作
  10. Cloudera果然向云出手了!新机器学习服务采用云原生路径!
  11. 公钥与私钥 数字签名是什么?
  12. 60. Event onfocus 事件
  13. UIAlertController中TextField的用法
  14. linux搭建windows无盘系统,linux下无盘系统的安装
  15. C++SOCKET面试题附答案
  16. 高性能高频RFID电子标签全向通道设备|图书馆防盗门HX-CH-TD6760性能与安装注意事项
  17. 仅有爱情是不够的(转载)
  18. “师创杯”山东理工大学第九届ACM程序设计竞赛 正式赛 I.皮卡丘的梦想2【树状数组】水题
  19. 大数据all_in环境搭建
  20. nodejs require/import导包报错以及解决方法,chalk-animation库使用

热门文章

  1. 【EslaticSearch】ES 搜索引擎详解
  2. 《蜡笔小新》精彩语录
  3. 在“区块链+”时代,美体内衣前景如何?
  4. 农家美女DIY远距离传输设备 3公里外无线上网
  5. 个人统计的部分知名电脑配件品牌,分别有 主板、CPU、散热器、内存条、硬盘、独立显卡 和 机箱电源。欢迎不同意见与纠错
  6. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day17】
  7. 说说三星智能机那些事
  8. 组合游戏(分石子,nim游戏,sg)
  9. CS231n系列课程Lecture6: Training Neural Networks, Part 2
  10. android 新浪微博客户端开发