一个典型的多表参与连接的复杂SQL调优(SQL TUNING)引发的思考

原创 2017年01月04日 14:29:08

今天在看崔华老师所著SQL优化一书时,看到他解决SQL性能问题的一个案例,崔华老师成功定位问题并进行了解决。这里,在崔华老师分析定位的基础上,做进一步分析和推理,以便大家一起研究探讨,下面简述该案例场景。

1、发生性能问题的SQL语句:

cu



--注:

  1)十几张表参与连接的较复杂SQL语句。


2、发生性能问题的执行计划:


--注:

  1)计划中节点19在表S_EVT_ACT上发生了FTS,据说该表上有700多W的数据量。

  2)计划中节点34在表S_ACT_EMP上发生了index range scan(索引范围扫描)。

3、不存在问题的执行计划:


--注:

  1)计划中节点23在表S_EVT_ACT上走了index unique scan(唯一索引扫描)。

  2)计划中节点19在表S_ACT_EMP上走了index range scan(索引范围扫描)。


4、分析:

    1)性能问题解决前,计划中节点19在S_EVT_ACT上发生了FTS;节点34在表S_ACT_EMP上发生了index range scan。

    2)性能问题解决后,计划中节点23在S_ECT_ACT上发生了index unique scan,且由原来的节点19推后到节点23;节点19在表S_ACT_EMP上发生了index range scan,访问方式与性能问题解决前没发生变化,而为之由原来的节点34被推前到节点19。

    3)对比性能问题解决前后,有两个变化,一个是表S_EVT_ACT由原来的FTS变为index unique scan,且为之被推后;另一个是表S_ACT_EMP为之被推前。变化的原因是optimizer_mode有原来的first_rows_10变为all_rows。

    4)针对前面讲到的,性能问题解决前后的两个变化,我们讨论下变化的起因和作用。性能问题解决前,因为optimizer_mode设置为first_rows_10,那么,CBO在这个模式下,面对这种比较复杂的多表连接的SQL语句,不会逐个去查询和计算每个参与连接的表的统计信息和成本,而是给出一个粗略评估的结果或默认值,为什么会这样,大家自己思考吧,其实,即使按照这个方法,也未必就一定出现性能问题,因为这种模式下,求的是反应速度,如果表S_EVT_ACT和其他表的连接字段的匹配性足够好,那么,也能达成反应速度最优的效果,这里,问题不在于走了FTS,而是在于表S_EVT_ACT连接字段的匹配性,可这种模式下,CBO不可能得出这个匹配性的准确结果的。因此,这是个非常冒险的决定,可这种模式就是这样,没办法。此外,针对表S_ACT_EM上index range scan在设置为all_rows模式后被推前,这个是无论如何都是应该的,大家看看这个SQL语句就明白了,只是在first_rows_10模式下,CBO发生了错误评估而已,这一点,也许也是影响性能的重要因素之一。

    5)由此可见,all_rows_X模式下,尤其是x比较低时,复杂的SQL语句就要小心了,也许,这个模式更适用于oltp业务,而不是olap业务。

个人之见,仅供参考。

注:本文素材来自崔华老师所著SQL优化一书。




版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

SQL调优(SQL TUNING)并行查询提示(Hints)之pq_distribute的使用

本文介绍了Oracle中pq_distribute提示的使用,记录于此,供同行及自己今后参考或学习。

一副美丽而庞大的SQL TUNING计划美图

本文分享一次SQL调优经历中的一个美丽而巨大的计划美图,希望各位在欣赏美图的同时,能从中有所启发,记录于此,供同行及自己今后学习研究。

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

POI使用【z】

本文将阐述如何用POI来读取/写入完整的Excel文件。    约定:POI项目2.0版现在已经接近正式发行阶段,开发进度迅速,不断有新的功能集成到原有的系统,同时也有对原有系统的修改。    为了保...

典型SQL题(多表联查)

1. 数据库表A 有个字段a是int类型  a中有数据有1到9任意(有重复的)  想取得a中,当 a=1时 a=2时 a=3…… 各一条记录的列表  select top 1 * fr...

JPA 原生态SQL 的复杂查询(多表Join)

import java.io.Serializable; import javax.persistence.*; import java.util.Set;          ...

SQL调优(SQL TUNING)之远程支持完成性能大幅优化

该文中记录了一次帮人SQL TUNING的过程,因为是REMOTE,且不能连接对方的库,只是通过简单的询问相关信息,支持对方完成了一个SQL TUNING,同时,因不能全面了解对方数据等多方面信息,也...

利用oracle sql tuning advisor 进行sql调优

sql tunning advisor 使用的主要步骤:   1 建立tunning task   2 执行task  3 显示tunning 结果  4 根据建议来运行相应的调优方法下面来按照这个顺...

SQL Tuning Advisor(SQL调优顾问,STA)

SQL调优化问需要一个或多个SQL语句作为输入,并调用自动优化器执行SQL调优。SQL调优顾问输出是以一种意见或者建议的形式,以及对每一项建议和期望效益的理由。该建议涉及对象的统计收集,新索引的创建,...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)