文档章节

Oracle执行计划调优-超级大表关联超级小表的性能调优

东皇巴顿
 东皇巴顿
发布于 2017/08/15 16:51
字数 328
阅读 88
收藏 0

今日客户现场出现一个查询SQL异常慢的情况。

用时分钟级别。

SELECT *
  FROM (SELECT a1.*, rownum rn
          FROM (SELECT openOrder2017.exchId,
                       ............
                       openOrder2017.internalbizmark,
                       customer.typeIdList
                  FROM openOrder2017, customer
                 WHERE openOrder2017.custId = customer.custId
                   AND openOrder2017.orderTime >= 20170810000000
                   AND openOrder2017.orderTime <= 20170811235959
                   AND openOrder2017.branchId IN ('001100', '001101')
                   AND openOrder2017.acctId IN ('##########')
                   AND openOrder2017.optLevel IN ('A0')
                   AND openOrder2017.custType IN
                       ('A2', 'A9', 'A1', 'A4', 'A3')
                 ORDER BY orderTime, serialNum) a1
         WHERE rownum <= 100) a2
 WHERE rn >= 1;

其中:

openOrder2017表数据量360万条;

customer表数据量76条;

执行计划利用上了ACCTID索引,但是有大量的NESTED LOOPS,导致异常高的逻辑读。

 

将SQL中的AND openOrder2017.acctId IN ('##########')条件取消,SQL查询速度反而变快了,但是走的是全表扫描方式。

突然醒悟,这是两个数据体量差距异常大的表,有严重的数据倾斜。通过openOrder2017.acctId索引访问,反而代价很大,择全表扫描的效率比选择索引要更高。

 

 改造为:
 FROM  openOrder2017 left join customer  on openOrder2017.custId = customer.custId
 WHERE  openOrder2017.orderTime >= 20170810000000
 AND openOrder2017.orderTime <= 20170811235959

执行计划虽然走了全表扫描,但是执行效率大幅提升了。

© 著作权归作者所有

共有 人打赏支持
东皇巴顿
粉丝 3
博文 62
码字总数 73311
作品 0
海淀
技术主管
加速你的Hibernate引擎(上)

1.引言 Hibernate是最流行的对象关系映射(ORM)引擎之一,它提供了数据持久化和查询服务。 在你的项目中引入Hibernate并让它跑起来是很容易的。但是,要让它跑得好却是需要很多时间和经验的...

红薯
2010/11/03
843
1
​风驰电掣:有效缩短SQL优化过程三步走!

作者介绍 梁敬彬,福富研究院副理事长、公司唯一四星级内训师,国内一线知名数据库专家,在数据库优化和培训领域有着丰富的经验。多次应邀担任国内外数据库大会的演讲嘉宾,在业界有着广泛的...

梁敬彬
2017/07/14
0
0
风驰电掣:有效缩短SQL优化过程三步走!

作者介绍 梁敬彬,福富研究院副理事长、公司唯一四星级内训师,国内一线知名数据库专家,在数据库优化和培训领域有着丰富的经验。多次应邀担任国内外数据库大会的演讲嘉宾,在业界有着广泛的...

梁敬彬
2017/07/14
0
0
生产环境大型sql语句调优实战第一篇(一)

在生产环境中有一条sql语句的性能极差,在早晨非高峰时段运行抽取数据,平均要花费40分钟,有时候竟然要跑10个多小时。 sql语句比较长,需要点耐心往下看。我对表的数据量都做了简单的说明。...

青夜之衫
2017/12/04
0
0
浅谈 MySQL 子查询及其优化

使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动表执行,然后在把该经验移植到mysql数据库上,但是不幸的是,mys...

大数据之路
2014/07/09
0
1

没有更多内容

加载失败,请刷新页面

加载更多

Spring中static变量不能@value注入的原因

今天本想使用@Value的方式使类中的变量获得yml文件中的配置值,然而一直失败,获得的一直为null。 类似于这样写的。 public class RedisShardedPool { private static ShardedJedisPool pool...

钟然千落
今天
2
0
CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
38
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部