Oracle基础表的选择,【Oracle】单表的选择率

本文只是记录《基于成本的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 <8

选择率=(limit-low_value)/(high_value-low_value)=(8-1)/(12-1)=7/11

month_no <=8

选择率=(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<=9

选择率=(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

选择率 =(9-6)/(12-1)+1/12

month_no>6 and month_no<=9

选择率 =(9-6)/(12-1)+1/12

month_no>6 and month_no<9

选择率 =(9-6)/(12-1)

4 双谓词

month_no>=8 or month_no<8

这个选择条件 表明 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 将得不到准确的执行计划

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值