查询转换是硬解析的第一步,在9i 中,它在CBO之前执行。10G以后,属于CBO的一部分。CBO会对查询转换做成本估算。
子查询展开:
将子查询拆开:不能做子查询展开的子查询通常在目标SQL的执行计划的最后一步才会被执行,并且走FILTER类的执行方式。改写不基于成本!!where条件为exists,in,=any的子查询,ORACLE会转换成相应的半连接。Notexists, not in,<>ALL 的子查询,ORACLE会转成反连接。
把子查询转换成内嵌的视图:改写是基于成本的,如果成本过大,则不会改。
IN 等于 =ANY,NOT IN 等于<>ALL
视图合并:
与子查询展开一样,都是是让优化器有更多的选择。
分为:
简单视图合并:不含外连接,视图中没有聚合函数,不含有UNION,UNION ALL,INTERECT,MINUS,CONNECT BY ,ROWNUM.简单视图合并等价改写的SQL一定是小于或等于不改写的SQL的,COST相等时也会采用改写。不做合并时,计划中会出现VIEW。关键字
外连接视图合并:表与视图,或是视图自身的定义有外连接。能做外连接视图合并的条件:目标视图作为外连接的驱动表或是作为被驱动表但只含有一个表。
复杂视图合并:含有group by ,distinct操作的延迟到之后再做。性能不一定会有提升。是否用成本来决定。_OPTIMIZER_COST_BASED_TRANSFORMATION 默认值为LINEAR,altersession set “_optimizer_cost_based_tranformation”=off;是否允许做复杂视图合并,_complex_view_merging
Alter session set “_complex_view_merging” =false;