很多人经常说,同样的SQL在Oracle中的查询性能要比在MySQL中好很多,大家有没有深究过其中的原因呢?除了MySQL 8.0之前不支持hash-join以外,还有其他原因吗?其实很多时候,出现这种差异的原因,是Oracle有查询重写的机制,并不是Oracle本身有多快,而是Oracle聪明的优化器已经帮你改好了SQL。首先,对比下面两张图,看看区别在哪里?

猜猜为什么会有区别?估计你们是猜不到的。。对比两个图,能看到图2中,oracle做了view merge,将 (select distinct t2.c1,t3.c3 from t2 inner join t3  on (t2.c2 =t3.c2 )) b 打开,view中的表与其他表放在一起计算连接方式,生成一个性能较好的执行计划;图1的执行计划中,外层循环一次,view就要执行一次,里面的谓词又不高效,因此,查询性能就表现得很差。就不卖关子了,其实,我在第一次执行SQL前,先将参数 "_complex_view_merging" 设成了false ,默认是true。实验过程如下:

在oracle中,复杂视图或嵌套视图(包含有group by 或 distinct)的视图合并,由_complex_view_merging隐藏参数控制,当设置为true时,优化器评估可能应用视图合并,但是当设置为false时,即使使用merge hint也不能应用视图合并。Tips:Oracle优化器真的是很强大,在生产上,最好不要轻易关闭优化器参数。上期分享的案例中的SQL,如果拿到Oracle中执行,因为有查询重写的机制,就不会出现执行效率差的现象。(感觉Oracle还是蛮厉害的。。)为了更加突出Oracle优化器的聪明,我在MySQL数据库中造了一模一样的数据,把这个sql拿到MySQL数据库中执行,看看性能如何?sql语句:

select * from tt1 inner join(select distinct tt2.c1,tt3.c3 from tt2 inner join tt3  on (tt2.c2 =tt3.c2 )) b on tt1.c1 = b.c1 ;

分析执行计划:首先执行 id=2 子查询的内容,根据条件“tt2.c2 =tt3.c2” 将表tt2和表tt3关联,需扫描行数约100000 * 2000;接着执行 id =1 ,将子查询的结果集和表 tt1 进行关联,需要扫描的行数约为10 * 2000000 ,那么执行这个sql一共需要扫描的行数大约是220,000,000行。执行了17分钟,结果也没出来,没耐心的我直接control + c了。。

显然,MySQL就没那么聪明了,并没有帮我们改SQL,规规矩矩的先执行子查询,再与外表做嵌套连接。模仿Oracle的改写方式,手动修改了sql文本:

select * from tt1 ,(select distinct c2, c1 from tt2) t2 ,(select distinct c2,c3 from tt3) t3where tt1.c1=t2.c1 and t2.c2=t3.c2;

执行计划发生了明显的改变,扫描的行数也大大减少。

执行一次,2.7秒结果就出来了,查询性能得到了显著提升。总结:1. 在Oracle数据库中,绝对不要根据经验,随便关闭优化器参数,存在即合理。2. 在MySQL数据库中,对于多表关联的SQL查询,编写时一定要慎重!


声明一下,写这篇文章的目的,不是想说Oracle多好,MySQL多么不好,研发SQL写得好,那么在MySQL中得查询性能也是一样一样的~

oracle关联视图查询满_对于复杂的SQL, Oracle是怎么做的?相关推荐

  1. oracle关联分组查询,oracle中关联查询、分组查询

    高级查询 1.关联查询 作用:可以跨越多表查询 --查询出员工的名字和他所在部门的的名字 //古老的写法 select first_name,name from s_emp,s_dept where ...

  2. oracle 组合视图,查询转换之视图合并

    视图合并常常发生在当外部查询块的谓语出现下列项的时候 能够在另一个查询块的索引中使用的列 能够在另一个查询块的分区截断中使用的列 在一个连接视图中能够返回限制行数 SQL> set autotr ...

  3. 写一个sql实现以下查询结果_书写高质量SQL的30条建议

    以下文章来源:后端程序员必备:书写高质量SQL的30条建议 1.查询SQL尽量不要使用select *,而是select具体字段. 反例子: select * from employee; 正例子: ...

  4. oracle关联表查询使用索引_SQL技巧:查询某个表关联的所有存储过程

    SQL技巧:查询某个表关联的所有存储过程 关键字:#SQL技巧# 背景 在开发过程中,可能需要更改某一个表的数据结构,或者更新数据.但你又不太清楚会造成什么影响,迟迟不敢下手进行调整.笔者[快乐IT] ...

  5. oracle function 写查询语句_五个 SQL 查询性能测试题,只有 40% 及格率,你敢来挑战吗?...

    作者 | 董旭阳TonyDong,CSDN 博客专家 责编 | 唐小引 头图 | CSDN 下载自东方 IC 出品 | CSDN 博客 下面是 5 个关于索引和 SQL 查询性能的测试题:其中 4 个 ...

  6. oracle关联表查询记录表最新一条记录

    SELECT * FROM 表1 t1JOIN (SELECT *,ROW_NUMBER() OVER(PARTITION BY 单据ID ORDER BY 处理时间 DESC) rnFROM 表2) ...

  7. oracle 带有变量的语句_【成都校区】Oracle SQL语句之常见优化方法总结

    本帖出自于黑马程序员成都中心,更多资源可关注微信公众号 1.SQL语句尽量用大写的: 因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行. 2.使用表的别名: 当在SQL语句中连接多 ...

  8. oracle里面如何查询sqlid,CSS_oracle中如何查看sql, --查询表状态:select uo.O - phpStudy...

    oracle中如何查看sql --查询表状态: select uo.OBJECT_NAME,uo.OBJECT_ID,lo.ORACLE_USERNAME,lo.LOCKED_MODE from us ...

  9. oracle最新版本是多少_运维日记|关于Oracle的补丁你需要知道的事

    各位新朋友-记得先点蓝字关注我哦- 之前一起熟悉了Oracle数据库的软件版本,服务周期,今天我们一起来了解下,Oracle发布的基础版本之上,常说的补丁到底是什么,有什么分类,经历了怎样的迭代. c ...

最新文章

  1. IBM大裁70% 员工,撕掉了国内大批伪AI企业最后一块遮羞布!
  2. 无线网***工具进攻方法及防范技巧
  3. Win8 Metro(C#)数字图像处理--3.3图像直方图计算
  4. 史上最轻量​!阿里新型单元测试Mock工具开源了
  5. 电脑机器人_视频|电话积分换平板电脑和扫地机器人?女子拿回家后……-
  6. 放大镜_小学科学实验器材使用规范之放大镜
  7. js学习小计6-慎用return false;
  8. 【工具使用系列】关于MATLAB 模型预测控制工具箱, 你需要知道的事
  9. Bad version number in .class file问题解决
  10. Android编程中利用AudioTrack播放PCM数据在音频的最后出现重复回声现象的解决方案
  11. zookeeper集群
  12. servicemix7 linux,学习ServiceMix笔记(三) 学习ServiceMix的基本命令之安装组件
  13. css实现动态阴影、蚀刻文本、渐变文本
  14. mysql下载安装安装包_mysql下载安装包及安装步骤
  15. 转一段群里看到的小诗,银才啊银才!
  16. 对抗神经网络(一)——GAN
  17. abb机器人goto指令用法_abb机器人编程指令,机器人编程的程序指令
  18. html怎么把网址设为首页,怎样让网站设为首页和加入收藏
  19. 怎样回答面试题更好?以及注意事项
  20. Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.

热门文章

  1. iOS之github第三方框架(持续更新)
  2. Redis介绍以及安装(Linux与windows)
  3. unity collider rigidbody zz
  4. OpenSSH 远程拒绝服务漏洞
  5. JavaEE实战班第19天
  6. 全球金融中心最新排位:深圳重回前十,大连杭州飙升
  7. 遇到网络问题你是怎么解决的?
  8. 为什么美团全面推动 K8S 落地,咬紧牙关也要搞云原生?
  9. 年薪35W+ 的程序员看过来!百万架构师第3期招生
  10. maven项目中整合grunt构建工具(二)-js合并、压缩技术