设为首页 收藏本站
查看: 549|回复: 0

[经验分享] Oracle-SQL优化-union和union all

[复制链接]

尚未签到

发表于 2016-7-29 11:35:33 | 显示全部楼层 |阅读模式
用union all替代union
Union因为要进行去除重复值的处理,所以效率要低
适用场合:1-如果合并两个select结果集,没有刻意要去除重复行
          2-如果union的各个select结果集,不存在交集
Oracle的内部处理过程:
union操作:先执行union all操作获取所有数据合集,再执行去除重复行操作。所以如果没有重复的,不要用union,效率低


下面通过一个案例说明一下
Sql1:union联合两个结果集
select DEAL_SERIAL_NO,
       VERSION_NO,
       START_DATE,
       END_DATE,
       PERIOD,
       COMPD_METHOD
  from tbinstcfl
union
select INTER_CODE as DEAL_SERIAL_NO,
       VERSION_NO,
       START_DATE,
       END_DATE,
       PERIOD,
       COMPD_METHOD
  from tbbondcfl
执行计划如下图:一共耗时6ms
DSC0000.png
Union操作:要先执行UNION-ALL操作获取结果集,再执行SORT-UNIQUE操作,看后面的时间,这个操作耗费2ms,如果数据量非常多的话,这个操作耗时和资源是非常惊人的。
Sql2:union all联合两个结果集
select DEAL_SERIAL_NO,
       VERSION_NO,
       START_DATE,
       END_DATE,
       PERIOD,
       COMPD_METHOD
  from tbinstcfl
union all
select INTER_CODE as DEAL_SERIAL_NO,
       VERSION_NO,
       START_DATE,
       END_DATE,
       PERIOD,
       COMPD_METHOD
  from tbbondcfl
执行计划如下图:一共耗时3ms
DSC0001.png
Union all操作:少了去除重复操作。去重复一项和上面比,就少了2ms,再看两个执行计划的最后一步整合数据,sql1用了2ms,sql2用了1ms,效率是不是高了很多

union和union all关键字需要注意的问题是:
union 和 union all都可以将多个结果集合并,而不仅仅是两个,你可以将多个结果集串起来。
使用union和union all必须保证各个select 集合的结果有相同个数的列,并且每个列的类型是一样的。但列名则不一定需要相同,oracle会将第一个结果的列名作为结果集的列名。例如下面是一个例子:

select empno,ename from emp
union
select deptno,dname from dept
我们没有必要在每一个select结果集中使用order by子句来进行排序,我们可以在最后使用一条order by来对整个结果进行排序。例如:
select empno,ename from emp
union
select deptno,dname from dept
order by ename;

对多个结果集进行合并处理的关键字有union,union all,intersect,minus
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
Intersect:对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
Minus:对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。


对上面两个结果集进行intersect操作,
Sql3:
select DEAL_SERIAL_NO,
       VERSION_NO,
       START_DATE,
       END_DATE,
       PERIOD,
       COMPD_METHOD
  from tbinstcfl
intersect
select INTER_CODE as DEAL_SERIAL_NO,
       VERSION_NO,
       START_DATE,
       END_DATE,
       PERIOD,
       COMPD_METHOD
  from tbbondcfl
执行计划如下图:一共耗时7ms
DSC0002.png
对上面两个结果集进行intersect操作,
select DEAL_SERIAL_NO,
       VERSION_NO,
       START_DATE,
       END_DATE,
       PERIOD,
       COMPD_METHOD
  from tbinstcfl
minus
select INTER_CODE as DEAL_SERIAL_NO,
       VERSION_NO,
       START_DATE,
       END_DATE,
       PERIOD,
       COMPD_METHOD
  from tbbondcfl
执行计划如下图:一共耗时7ms
DSC0003.png
总结:对两个结果集的union,union all,intersect,minus操作
耗时:
Union all:3ms
1.两个结果集的全表扫描获取2.获取所有展现数据
Union:6ms
1.两个结果集的全表扫描获取2.去除重复操作3.获取所有展现数据
Intersect:7ms
1.两个结果集的全表扫描获取2.两个结果集的唯一性排序3.获取交集4.获取所有展现数据
Minus:7ms
1.两个结果集的全表扫描获取2.两个结果集的唯一性排序3.获取差集4.获取所有展现数据
Intersect和minus的获取交集和差集如执行计划图,没有耗费时间,这个内部机制没有研究,不过由于之前是唯一性排序,所以即使耗时也很少,就当做不耗时了

了解内部运行机制:优化一切尽在掌握

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-251177-1-1.html 上篇帖子: Oracle数据库之PLSQL游标 下篇帖子: oracle 物化视图与普通视图
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表