关闭

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

标签: SQL调优SQL TUNINGSQL优化数据库优化Oracle
244人阅读 评论(0) 收藏 举报
分类:

今天在看崔华老师所著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优化一书。




0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

SQL Tuning Advisor 使用11G的自动调优建议

ORACLE 提供了自动SQL优化的工具,当对DBA来说 可以节约下思考的时间,或许提供更多的参考价值
  • ZengMuAnSha
  • ZengMuAnSha
  • 2016-06-03 11:40
  • 6080

SQL多表连接查询(详细实例)

表A: student 截图如下 表B: course 截图如下: 表C: student_course 截图如下: 一个学生可以选择多门课程,一门课程可以被多个学生选择,因此学生表student和课程表course之间是多对多的关系。 当两表为多对多关系的时候,我们需要建立一个中...
  • lz37025
  • lz37025
  • 2017-06-09 13:25
  • 427

SQl Server 数据库多表连接

【缘由】      为了防止数据的冗余,我们会将数据库中表进行拆分,这样就产生了多张表,表与表之间通过主外键关联,但这样又造成了我们查找和修改的困难,如何进行多表之间的查找呢?      我们将一个查询同时设计两个或两个以上的表,称之为...
  • u013038643
  • u013038643
  • 2015-09-13 10:00
  • 1162

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

import java.io.Serializable; import javax.persistence.*; import java.util.Set;          ...
  • u013444177
  • u013444177
  • 2014-03-07 15:06
  • 1094

SQL之多表连接

这章主要讲通过使用左连接,右连接,内连接,外连接及自然连接等方式进行多表查询。例如要查询人员的编号、姓名、部门编号及部门名字,只是通过人员表,是查不到部门名字的,只能查到部门编号,这就需要通过人员表的部门编号(外键)和部门表的部门编号(主键)进行关联查询。 表连接方式: 交叉连接(笛...
  • fjseryi
  • fjseryi
  • 2016-03-09 14:36
  • 679

面试中sql多表查询的问题!!!

面试中遇到的,这个问题其实不难,只是工作很多时候细节不会去多想,然后搞得关键时间掉链子!!! 上面是teacher和student表,和相关的数据; 问题就是当student数据表中teacher的id_tid全为null,和有数据如图所示的时候,作连接、内连接和右连接结果有多少行; s...
  • lhp534
  • lhp534
  • 2016-09-26 09:36
  • 546

初次使用SQL调优建议工具--SQL Tuning Advisor

在10g中,Oracle推出了自己的SQL优化辅助工具: SQL优化器(SQL Tuning Advisor :STA),它是新的DBMS_SQLTUNE包。使用STA一定要保证优化器是CBO模式下。但是我认为使用这种工具,仅适合完全不懂SQL的调优的人群,不...
  • guogang83
  • guogang83
  • 2014-05-23 09:29
  • 2102

sql:连接查询跟多表查询的区别

连接查询包括合并、内连接、外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要。 只有真正了解它们之间的区别,才能正确使用。 1、Union UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABL...
  • ghostyusheng
  • ghostyusheng
  • 2016-02-16 13:01
  • 1935

SQL语句多表查询例子

转自:http://blog.sina.com.cn/s/blog_7e5541250100ygb1.html 1、问题及描述: 学生表 Student(Sid,Sname,Sage,Ssex) --Sid 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 课程表 Cour...
  • stypace
  • stypace
  • 2015-04-01 18:22
  • 6667

sql(三):多表查询、左右连接、组函数与分组统计

一、多表查询 之前查询都是在一张表上进行的查询,如果使用多张表进行查询,则称为多表查询。格式如下: select {DISTINCT}* | 具体列名 别名 form 表名称 { where 条件(s) } {order by 排序的字段1 ASC | DESC,排序的字段2 ASC | DE...
  • Troy__
  • Troy__
  • 2014-04-21 16:04
  • 4115
    个人资料
    • 访问:110394次
    • 积分:2434
    • 等级:
    • 排名:第17610名
    • 原创:132篇
    • 转载:13篇
    • 译文:0篇
    • 评论:3条
    最新评论