CBO学习----03--选择率(Selectivity)(三)

2014-11-24 15:58:20 · 作者: · 浏览: 6
章中也看出了它的一个弊端(引起rows的计算错误,统统5%)
因此,9i引入了绑定变量窥视
在绑定变量的SQL语句,第一次执行时,窥视一下变量的值,给出正确的rows,并选择最优路径,之后提炼出可与后面语句共享的部分,无论绑定变量是否变化,都会使用该共享。
在变量为字符串类型时,字符串长度变化较大时,执行计划会有所变化。
具体如何变化有待研究
/**************************************************************************************************************************************/
range上10104的更新


本章代码附件中:
ranges_10g.sql

条件 10102 10104 10204
month_no between 6 and 9  527 527 527
month_no between 14 and 17 100 82 100
month_no between 18 and 21 100 45 100
month_no between 24 and 27 100 1 100
正如前面提到的,在10104,超出边界值时,默认采用一个斜率为 "1/最大值-最小值" 的线性衰变
但在10204上又将默认改回去了
具体是哪个参数控制的,有待研究


/**************************************************************************************************************************************/

3.5 Two Predicates(双谓词)
where
month_no > 8
or month_no <= 8

此时计算的rows=986
本章代码附件中:
ranges_02.sql
类似上面的条件,列出了1-12的所有rows
rows
1 1,108
2 1,110
3 1,040
4 989
5 959
6 948
7 957
8 986
9 1,035
10 1,103
11 1,192
12 1,200
优化器仅仅将条件判断为:两个由or连接起来的谓词
selectivity(predicate1 AND predicate2) = selectivity(predicate1) * selectivity(predicate2)                                                                      
selectivity(predicate1 OR  predicate2) = selectivity(predicate1) + selectivity(predicate2) - selectivity(predicate1 AND predicate2)
selectivity(NOT predicate1) = 1 – selectivity(predicate1)

本章代码附件中:
two_predicate_01.sql
解释了上面两个谓词时的运算
bind_between.sql
分析了绑定变量下,两个谓词时的选择率
/**************************************************************************************************************************************/
3.6 多个谓词的相关问题
计算一下下面的选择率
where
month_no > 8 -- (predicate 1)
or month_no <= 8 -- (predicate 2)

selectivity(predicate1)简称s(p1),以此类推

s(p1) = (12 – 8) / (12 – 1) = 4/11
s(p2) = (8 – 1) / (12 – 1) + 1/12 = 7/11 + 1/12
s(p1 and p2) = 4/11 * (7/11 + 1/12)
s(p1 or p2) = s(p1) + s(p2) - s(p1 and p2) = 4/11 + 7/11 + 1/12 - 4/11 * (7/11 + 1/12) =0.8216

1200*0.8216=986

/**************************************************************************************************************************************/

三个谓词时会如何呢?
month_no in (6,7,8)就类似于三个谓词被or连接
sel(A or B or C) = sel(A) + sel(B) + sel(C) – Sel(A)sel(B) – Sel(B)sel(C) – sel(C)sel(A) + Sel(A)Sel(B)Sel(C)

带入month_no in (6,7,8)会得出相应的rows=276
如果一个表中,不同列有依赖关系时,如何计算选择率呢?例如月份列+星座列
9i动态采样、10gfrofile