ORACLE中的查询转换有哪些

本篇内容主要讲解“ORACLE中的查询转换有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ORACLE中的查询转换有哪些”吧!

创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站建设、网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的海宁网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

一、子查询展开(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中已有,适合表与表之间通过外键连接,或者表与表之间是外连接的情况

到此,相信大家对“ORACLE中的查询转换有哪些”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


本文标题:ORACLE中的查询转换有哪些
网址分享:http://csdahua.cn/article/jpggos.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流