开发者社区> yangyi_dba> 正文

【Oracle】单表的选择率

简介:   本文只是记录《基于成本的oracle 优化法则》的简单的笔记(因为要重新搭建RAC 把之前的环境删掉了,oracle 环境还没建好,现在先纸上谈兵一下 ) 优化器并没有智能--只是一个软件! 1 对含有空值的字段  基本选择率=1/num...
+关注继续查看
  本文只是记录《基于成本的oracle 优化法则》的简单的笔记(因为要重新搭建RAC 把之前的环境删掉了,oracle 环境还没建好,现在先纸上谈兵一下 003.gif)
优化器并没有智能--只是一个软件!
1 对含有空值的字段 
基本选择率=1/num_distinct
num_nulls=120
num_rows=1200
选择率=基本选择率*(num_rows-num_nulls)/num_rows=1/12*((1200-120)/1200)=0.075
调整后的基数=1200*0.075=90
2 对于in-list
比如: 
select count(1) from aud where month_no in (6,7,8);
 oracle 会在解析sql的时候将in list转换为or 的形式 :month_no=6 or month_no=7 or month_no=8 
 选择率类似联合概率:
 P(A OR B ORC)=P(A)+ P(B)+P(C)-P(A AND B)-P(A AND C)-P(C AND B)+P(A AND B AND C)
 3/12-3/144+1/1728=0.22975 
 基数=1200*0.22975=275.69
3 对于区间谓词
  month_no > 8
  选择率=(high_value-limit)/(high_value-low_value)=(12-8)/(12-1)=4/11
  month_no >=8
  选择率=(high_value-limit)/(high_value-low_value)+1/num_distinct =(12-8)/(12-1)+1/12=4/11+1/12
  month_no
选择率=(limit-low_value)/(high_value-low_value)=(8-1)/(12-1)=7/11 
  month_no
选择率=(limit-low_value)/(high_value-low_value)+1/num_distinct=(8-1)/(12-1)+1/12=7/11+1/12   
month_no between 6 and 9  month_no>=6 and month_no
选择率=(hight_limit-low_limit)/(high_value-low_value)+1/num_distinct+1/num_distinct=(9-6)/(12-1)+1/12+1/12
  month_no>=6 and month_no
  选择率 =(9-6)/(12-1)+1/12  
month_no>6 and month_no
  选择率 =(9-6)/(12-1)+1/12  
month_no>6 and month_no
  选择率 =(9-6)/(12-1)
4 双谓词
month_no>=8 or month_no
这个选择条件 表明 oracle 的用化器并没有把 谓词看成整体而是独立的谓词。其选择率为
 P(A OR B)=P(A)+ P(B)-P(A AND B)
而对于 and   和 not 条件的选择率的计算方法如下: 
P(A AND B)=P(A)* P(B)
 NOT P(A)=1-P(A)
 oracle 在解析执行计划的时候,将各个谓词视为独立的谓词,当一个表使用多个谓词时,必须确保各个谓词之间没有必然联系,否则cbo 将得不到准确的执行计划
阅读(3731) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册

', title : '选择类型', width : 300, height : 150, scroll : 'no', callback : function(action){ if(action == 'close'){ $.cover(false); } } }); }); $('#admin_delete').live('click' , function(){ ///blog/logicdel/id/3480184/url/%252Fblog%252Findex.html.html var type = $('#del_type').val(); var url = '/blog/logicdel/id/721479/url/%252F22664653%252F/'; window.location.href= url + '?type=' + type; }); //顶 js中暂未添加&过滤 $('#digg').live('click' , function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', '/site/login/'); return false; } var bid = $('#digg').attr('bid'); var url = $('#digg').attr('url'); var digg_str = $.cookie('digg_id'); if(digg_str != null) { var arr= new Array(); //定义一数组 arr = digg_str.split(","); //字符分割 for( i=0 ; i '; tpl += '
'; tpl += '文明上网,理性发言...'; tpl += '
'; tpl += '
'; tpl += '
'; tpl += ''; tpl += '
'; tpl += '
'; tpl += '

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Oracle 19c 补丁升级引发的单表恢复失败谜案
问题表现 某客户在恢复 Oracle 数据库的单表时,提示类似下面的信息
13 0
单表七千六百万数据量(oracle)进行实时汇总,sql很慢客户不能忍一下,该怎么办?
单表七千六百万数据量(oracle)进行实时汇总,sql很慢客户不能忍一下,该怎么办?
113 0
Oracle-单表查询
关于单张表的操作(分组、排序、条件查询、函数)
1122 0
Oracle OGG 单表重新初始化同步的两种思路
OGG 单表重新初始化同步的两种思路
3894 0
卸载Oracle软件和数据库(deinstall)
可以使用deinstall命令停止和删除Oracle数据库主目录中的Oracle数据库软件和组件。
7 0
启动一个新的Oracle从进程,数据库就连不上了!(ORA-27303)
一线的工程师反映,一个客户在安装了我们公司的产品后,客户的数据库突然出现客户端无法连接的现象!
12 0
Oracle 数据库自动诊断库 ADR(Automatic Diagnostic Repository)简介 发表在 数据和云
Oracle 数据库如果出现故障,我们的第一个反应是查看数据库的 alert log,但一些工程师对 alert log 不熟悉,实际上 alert log 位于Oracle 数据库自动诊断库(Automatic Diagnostic Repository,以下简称 ADR) 中,要熟悉 alert log,我们必需全面了解 ADR 的概念。
15 0
+关注
yangyi_dba
数据库相关技术专家
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
迁移 ORACLE 最佳实践
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关镜像