设为首页 收藏本站
查看: 762|回复: 0

[经验分享] Oracle优化器和直方图

[复制链接]

尚未签到

发表于 2018-9-15 06:11:14 | 显示全部楼层 |阅读模式
  一、优化器的分类
  Oracle7和Oracle8 都有两种可以为SQL语句导出执行计划的优化器:
  - 基于规则的优化器(RBO
  继承自Oracle6,它使用一系列严格的规则来决定每个SQL语句的执行计划。如果你知道这些规则,
  你可以构造一个SQL查询使其以指定的方式访问数据。表的内容对于执行计划没有影响。
  这个优化器已经不再被增强了,所以不能使用很多oracle8的特性。
  - 基于成本的优化器(CBO)
  从Oracle7开始引入,该优化器尝试找到最低成本的访问数据的方法,为了最大的吞吐量或最快的初始响应时间。
  计算使用不同的执行计划的成本,并选择成本最低的一个。关于表的数据内容的统计被用于确定执行计划。
  Fundamental Points 基本点
  对于每个SQL语句,都有很多可能的执行计划。“最佳计划”永远是“最佳计划”,无论它如何到达。
  最佳计划可以由两个意思:
  1 此计划使用最小的资源来处理此语句涉及到的所有行。 [叫做ALL_ROWS]
  2 此计划以最短的时间返回这个语句的第一行 。 [叫做FIRST_ROWS]
  CBO不理解应用的相关特性,也不能完全理解关联表之间的复杂关系的影响。仅有有限的信息可以用来确定最佳计划。
  CBO通过计算不同执行方案的估计成本来确定最佳计划,并选用最低成本的计划。因为这个关系到相关成本的假设,
  所选的计划不一定是真的最好的计划。这种情况经常被当作BUG报告给oracle 技术支持,因为 CBO没有为一个指定方案选择一个最佳的计划。
  
  二、直方图
  
  从版本10g开始Oracle会自动收集Histogram,Histogram是否收集取决于col_usage$中记录的关于该列用作SQL中谓词条件的信息和数据分布情况.
  SMON定期将shared pool中的谓词使用状况刷新到col_usage$表中。
  例如:
  Select * from tab where colA=1;
  则记录为对colA充当 EQUALITY_PREDS—>equality predicates等式谓词
   DSC0000.png
  二、CBO何时使用直方图
  有2个地方Oracle Optimizer优化器会用到Histogram:
  •过滤谓词的选择性评估
  •Join连接基数(Cardinality)评估
  •在做Join连接基数(Cardinality)评估时,往往差之毫厘谬之千里:
  •优化器可能选择错误的Join连接方式或顺序。
  •例如分页排序查询 因为基数评估误差导致去用了HASH JOIN…..
  三、直方图的bucket桶数
  Histogram的Buckets桶数
  •对于绝大多数情况默认的75个桶总是合适的
  •最大桶数= 最小值(254,其他因素限制桶数)
  •若频繁出现地distinct值的数据并不多,则将桶数设置为大于这个数目往往是有益的。
  
  四、直方图的分类
  版本12c之前有2种类型Histogram
  1、Height Balanced Histogram高度平衡直方图
  •列值被分成多个buckets
  •每个bucket包含大致一样数目的行数
  •当NDV>254时会采用高度平衡直方图(注意dbms_stats采样到的NDV未必是实际的NDV)
  特点:
  •每个buckets桶里的行数都大致相同,除了最后一个桶
  •最后一个桶中的可能比其他桶中的少
  •每个桶中最大值成为bucket value endpoint_value
  •每个value值占有一个桶的一部分,按比例
  2、Frequency Histogram(Value-Based )频率直方图
  •该列上每一个值都会具有频率信息
  •当NDV( number of distinct values)的个数 'EMP',

  METHOD_OPT => 'FOR COLUMNS>  END;
  /
  SELECT column_name, num_distinct, num_buckets, histogram
  FROM USER_TAB_COL_STATISTICS
  WHERE table_name = 'EMP' AND column_name = 'SAL';
  结果:

  SELECT endpoint_number, endpoint_value
  FROM USER_HISTOGRAMS
  WHERE table_name = 'EMP' and column_name = 'SAL'
  ORDER BY endpoint_number;
  结果:

  上图中,每行对应高度直方图中的每个间隔。
  (2)频率直方图在频率直方图中,列中每个唯一数据相当于高度直方图中的每个间隔,其高度对应该数据在列中出现的次数。当列中distinct值得个数小于或等于直方图的分格段的个数(即num_buckets的值)时,频率直方图会被自动建立。查看频率直方图的语法如下:
  BEGIN
  DBMS_STATS.GATHER_table_STATS (OWNNAME => 'scott', TABNAME => 'EMP',

  METHOD_OPT => 'FOR COLUMNS>  END;
  SELECT column_name, num_distinct, num_buckets, histogram
  FROM USER_TAB_COL_STATISTICS
  WHERE table_name = 'EMP' AND column_name = 'SAL';
  结果:

  SELECT endpoint_number, endpoint_value
  FROM USER_HISTOGRAMS
  WHERE table_name = 'EMP' and column_name = 'SAL'
  ORDER BY endpoint_number;
  结果:

  整理的时候发现下面两篇文章也不错
  http://blog.csdn.net/outget1/article/details/4833881
  http://hi.baidu.com/wuzhanyin/item/6b0d35dff9316439e3108fed


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-583004-1-1.html 上篇帖子: 从oracle dba的角度看HANA数据库 下篇帖子: oracle本地乱码解决
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表