本篇内容主要讲解“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中的查询转换有哪些”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。