oracle 11g中range join的selectivity

关于oracle 11g中range join的selectivity
j.lewis在其书(cbo)中提到过oracle 的range join时,其selectivity使用了绑定变量的0.05的固定值,不过这一现象在11g被彻底改变了
 
11g在计算范围连接时需要考虑连接列的相互大小关系以及大于号(小于号)左右的表关系
 
总的连接选择率如下:
Selectivity of Join = (A + (B + C) / num_distinct(t1)) / num_distinct(t2)
 
若大于号左边的表的连接列high_value大于右边表连接列的high_value,则A部分公式如下,否则为0:
A = high_value(t2.join) – high_value(t1.join), where high_value(t2.join) > high_value(t1.join). Otherwise A = 0
 
范围连接时,B部分的公式如下,无前提条件:
B = (least(high_value(t2.join), high_value(t1.join)) – great(low_value(t1.join), low_value(t2.join)) * (least(high_value(t2.join), high_value(t1.join)) – great(low_value(t1.join), low_value(t2.join)) + 1) / 2
 
若大于号左边的表的连接列low_value小于等于右边表连接列的low_value,则C部分公式如下,否则为0:
C = (great(low_value(t1.join), low_value(t2.join)) – least(low_value(t1.join), low_value(t2.join))) * (least(high_value(t2.join), high_value(t1.join)) - great(low_value(t1.join), low_value(t2.join)) + 1), where low_value(t2.join) > low_value(t1.join). Otherwise C = 0
 
注意这里的t2、t1的关系
t2是“>”左边的表,而t1 为右边的表
 
最终范围连接所得行源公式如下:
cardinality of range join = card of selectivity(1) * card of selectivity (2) * ... * join selectivity(1) * join selectivity(2) * ...

最后注明:以上内容转自国外网站(源地址忘了 033.gif),不过实际优化中也不太会使用这么复杂的公式~~  这里主要为了说明11g的range join在处理选择率时已不再草率的使用0.05这一固定值了

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

转载于:http://blog.itpub.net/9547781/viewspace-758641/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值