CBO学习----03--选择率(Selectivity)(三)
章中也看出了它的一个弊端(引起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