温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ORACLE中的查询转换有哪些

发布时间:2021-11-08 14:14:11 来源:亿速云 阅读:283 作者:iii 栏目:关系型数据库

本篇内容主要讲解“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中的查询转换有哪些”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI