ITPub博客

首页 > 数据库 > Oracle > ORACLE中的查询转换

ORACLE中的查询转换

原创 Oracle 作者:james210 时间:2019-12-10 16:02:55 0 删除 编辑

一、子查询展开(subquery unnesting)

子查询展开分两种:

1、要么将子查询中的表或视图拆开来跟外面的表做连接,

2、要么不拆开子查询,而是当作一个内嵌视图与外面的表做连接

不是所有子查询都会做子查询展开,子查询展开的条件

1、子查询展开后的SQL跟原SQL一定要完全等价

2、对于子查询不拆开,而是当作一个内嵌视图的子查询展开,改写后的SQL成本之要小于原SQL才行


子查询前的where条件是下列条件之一,那么满足一定条件就会做子查询展开

single-row(即=,<,>,>=,<=,<>)

exists

not exists

in

not in

any

all


二、视图合并(view merging)

把视图不在当作一个独立的处理单元,而是将其拆开,把构成视图的基表拿出来跟外部查询中的表进行连接,分三种

1、简单视图合并(simple view merging)

指不含外连接,以及所带视图的视图定义中不含distinct ,group by 等聚合函数的目标SQL的合并,另外不能出现以下

集合运算符(union ,union all,minus,intersect)

connect by 子句

rownum


2、外连接视图合并(outer join view merging)

外部查询的表与视图之间使用了外连接,或者视图的定义SQL中使用了外连接,以及所带视图的视图定义中不含distinct ,group by 等聚合函数的目标SQL的合并

有个简单的前提,要么该视图做为外连接的驱动表,如果作为被驱动表,则该视图的sql定义中只能有一张表


3、复杂视图合并(complex view merging)

所带视图的视图定义中含有distinct ,group by 等聚合函数的目标SQL的合并

复杂视图合并会把sql拆分,先把基表跟外部表连接后在做distinct ,group by,所有复杂视图合并不一定会带来成本值的减少,oracle会比较合并后的SQL,只有当合并后SQL的成本值低于原SQL成本值,才会做复杂视图合并

两个隐含参数 

通过查询转换前后的成本值来决定是否转换,参数_optimizer_cost_based_transformation可以在session和system级别修改,默认值'linear',默认通过成本值比较来转换sql,改为‘OFF',则不管成本值都会进行复杂视图合并。

_complex_view_merging,默认为true,允许复杂视图合并,改为false,关闭复杂视图合并


三、星型转换

star_transformation_enabled 

默认为false ,需要启用则设置为true,也可以设置为temp_disable(不建临时表)


四、连接谓词推入

优化处理带视图的SQL

仅支持以下类型

视图定义中含有union all/union

视图定义中含有distinct

视图定义中含有group by

于外部查询的连接时外连接

与外部查询的连接时半连接

与外部查询的连接时反连接


五、连接因式分解

优化器处理带union all 的SQL时的一种优化方式

11gr2中才有


六、表扩展(table expansion)

优化器处理分区表的一种优化方式

11gr2才有

hint 两个 no_expand_table ,expand_table


七、表移除(table elimination)

10gr2中已有,适合表与表之间通过外键连接,或者表与表之间是外连接的情况




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26031282/viewspace-2667322/,如需转载,请注明出处,否则将追究法律责任。

上一篇: ORACLE的游标共享
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2011-11-07

  • 博文量
    17
  • 访问量
    12333