SQL>> 注意:在使用RBO的情况下可以通过等价改写目标sql(加0或者空字符串的方式)来调整该sql的执行计划
如:select * from emp_temp where mgr>100 and deptno+0>100; (deptno类型为number)
说明:
①:当目标sql有两条或者两条以上的执行计划的等级值相同时,我们确实可以通过调整相关对象在数据字典缓存中的缓存顺序来影响RBO对于其执行计划的选择;
②:如果RBO仅凭目标sql各条执行路径等级值的大小就可以选择出执行计划,那么无论怎么调整相关对象在该sql的sql文本中的位置,对于该sql最终的执行计划都不会有任何影响; 1.2、基于成本的优化器-CBO(从Oracle10G开始解析目标sql时默认使用CBO)
基于成本的优化器是指Oracle根据相关对象的统计信息计算出来的一个值,它实际上就是目标sql对应执行步骤的I/O CPU 和网络资源的消耗量的一个估算值; 2、CBO的一些基本概念:
①:cardinality(集的优势):是CBO特有的概念,它是指指定集合所包含的记录数;它实际上表示对目标sql的某个具体执行步骤的执行结果所包含记录数的估算。
②:可选择率:也是CBO特有的概念,它是指施加指定谓词条件后返回结果集的记录数占未施加任何谓词条件的原始结果集的记录数的比率。可选择率的取值范围是0~1,它的值越小,就表名可选择性越好,毫无疑问,可选择率为1时的可选择性是最差的;
③:可传递性:而是CBO特有的概念,其含义是指CBO可能会对原目标SQL做简单的等价改写,即在原目标SQL中加上根据sql现有的谓词条件推算出来的新谓词条件,这么做的目的是提供更多的执行路径给CBO做选择,进而增加得到更高效执行计划的可能性;
在Oracle里,可传递性又分为如下三种情形:
①:简单谓词传递
比如原目标sql的谓词条件是“t1.c1=t2.c1 and t1.c1=10”,则CBO可能会在这个谓词条件中额外地加上“t2.c1=10”,即被修改成
t1.c1=t2.c1 and t1.c1=10 and t2.c1=10
②:连接谓词传递
比如原来目标sql中的谓词条件是“t1.c1=t2.c1 and t2.c1=t3.c1”,则CBO可能会在这个谓词条件中额外地加上“t1.c1=t3.c1”,即被
修改成“t1.c1=t2.c1 and t2.c1=t3.c1 and t1.c1=t3.c1”
③:外连接谓词传递
比如原目标sql中的谓词条件是“t1.c1=t2.c1(+) and t1.c1=10”,则CBO可能会在这个谓词条件中额外加上“t2.c1(+)=10”,即被修改成
“t1.c1(+) and t1.c1=10 and t2.c1(+)=10”