关于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) * ...
最后注明:以上内容转自国外网站(源地址忘了
),不过实际优化中也不太会使用这么复杂的公式~~ 这里主要为了说明11g的range join在处理选择率时已不再草率的使用0.05这一固定值了
![033.gif](/images/edit/face/033.gif)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9547781/viewspace-758641/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9547781/viewspace-758641/