oracle关联视图查询满_对于复杂的SQL, Oracle是怎么做的?
猜猜为什么会有区别?估计你们是猜不到的。。对比两个图,能看到图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) t3
where tt1.c1=t2.c1 and t2.c2=t3.c2;
执行计划发生了明显的改变,扫描的行数也大大减少。
执行一次,2.7秒结果就出来了,查询性能得到了显著提升。总结:1. 在Oracle数据库中,绝对不要根据经验,随便关闭优化器参数,存在即合理。2. 在MySQL数据库中,对于多表关联的SQL查询,编写时一定要慎重!
声明一下,写这篇文章的目的,不是想说Oracle多好,MySQL多么不好,研发SQL写得好,那么在MySQL中得查询性能也是一样一样的~
oracle关联视图查询满_对于复杂的SQL, Oracle是怎么做的?相关推荐
- oracle关联分组查询,oracle中关联查询、分组查询
高级查询 1.关联查询 作用:可以跨越多表查询 --查询出员工的名字和他所在部门的的名字 //古老的写法 select first_name,name from s_emp,s_dept where ...
- oracle 组合视图,查询转换之视图合并
视图合并常常发生在当外部查询块的谓语出现下列项的时候 能够在另一个查询块的索引中使用的列 能够在另一个查询块的分区截断中使用的列 在一个连接视图中能够返回限制行数 SQL> set autotr ...
- 写一个sql实现以下查询结果_书写高质量SQL的30条建议
以下文章来源:后端程序员必备:书写高质量SQL的30条建议 1.查询SQL尽量不要使用select *,而是select具体字段. 反例子: select * from employee; 正例子: ...
- oracle关联表查询使用索引_SQL技巧:查询某个表关联的所有存储过程
SQL技巧:查询某个表关联的所有存储过程 关键字:#SQL技巧# 背景 在开发过程中,可能需要更改某一个表的数据结构,或者更新数据.但你又不太清楚会造成什么影响,迟迟不敢下手进行调整.笔者[快乐IT] ...
- oracle function 写查询语句_五个 SQL 查询性能测试题,只有 40% 及格率,你敢来挑战吗?...
作者 | 董旭阳TonyDong,CSDN 博客专家 责编 | 唐小引 头图 | CSDN 下载自东方 IC 出品 | CSDN 博客 下面是 5 个关于索引和 SQL 查询性能的测试题:其中 4 个 ...
- oracle关联表查询记录表最新一条记录
SELECT * FROM 表1 t1JOIN (SELECT *,ROW_NUMBER() OVER(PARTITION BY 单据ID ORDER BY 处理时间 DESC) rnFROM 表2) ...
- oracle 带有变量的语句_【成都校区】Oracle SQL语句之常见优化方法总结
本帖出自于黑马程序员成都中心,更多资源可关注微信公众号 1.SQL语句尽量用大写的: 因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行. 2.使用表的别名: 当在SQL语句中连接多 ...
- 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 ...
- oracle最新版本是多少_运维日记|关于Oracle的补丁你需要知道的事
各位新朋友-记得先点蓝字关注我哦- 之前一起熟悉了Oracle数据库的软件版本,服务周期,今天我们一起来了解下,Oracle发布的基础版本之上,常说的补丁到底是什么,有什么分类,经历了怎样的迭代. c ...
最新文章
- IBM大裁70% 员工,撕掉了国内大批伪AI企业最后一块遮羞布!
- 无线网***工具进攻方法及防范技巧
- Win8 Metro(C#)数字图像处理--3.3图像直方图计算
- 史上最轻量​!阿里新型单元测试Mock工具开源了
- 电脑机器人_视频|电话积分换平板电脑和扫地机器人?女子拿回家后……-
- 放大镜_小学科学实验器材使用规范之放大镜
- js学习小计6-慎用return false;
- 【工具使用系列】关于MATLAB 模型预测控制工具箱, 你需要知道的事
- Bad version number in .class file问题解决
- Android编程中利用AudioTrack播放PCM数据在音频的最后出现重复回声现象的解决方案
- zookeeper集群
- servicemix7 linux,学习ServiceMix笔记(三) 学习ServiceMix的基本命令之安装组件
- css实现动态阴影、蚀刻文本、渐变文本
- mysql下载安装安装包_mysql下载安装包及安装步骤
- 转一段群里看到的小诗,银才啊银才!
- 对抗神经网络(一)——GAN
- abb机器人goto指令用法_abb机器人编程指令,机器人编程的程序指令
- html怎么把网址设为首页,怎样让网站设为首页和加入收藏
- 怎样回答面试题更好?以及注意事项
- Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.