文档章节

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

东皇巴顿
 东皇巴顿
发布于 2017/08/15 16:51
字数 328
阅读 76
收藏 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语句调优实战第一篇(一)

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

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

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

大数据之路
2014/07/09
0
1
十一、oracle 数据库管理员

一、数据库管理员 每个oracle数据库应该至少有一个数据库管理员(dba),对于一个小的数据库,一个dba就够了,但是对于一个大的数据库可能需要多个dba分担不同的管理职责。那么一个数据库管理员...

openlife
2015/07/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

jquery创建类似于java的map

var map = {}; // Map map = new HashMap(); map[key] = value; // map.put(key, value); var value = map[key]; // Object value = map.get(key); var has = key in map; // boolean has = ......

SuperDabai
30分钟前
0
0
java大数据转换16进制转10进制

public static void main(String[] args) {String hex = "0xdbf3accc683297cf0000";BigInteger amount = new BigInteger(hex.substring(2), 16);System.out.println(amount);......

任梁荣
昨天
1
0
OSChina 周六乱弹 —— 目测我们程序员丁克的几率不大

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @真Skr小机灵鬼儿:8.13分享Jocelyn Pook/Russian Red的单曲《Loving Strangers》 《Loving Strangers》- Jocelyn Pook/Russian Red 手机党少...

小小编辑
昨天
9
3
TypeScript基础入门 - 函数 - 剩余参数

转载 TypeScript基础入门 - 函数 - 剩余参数 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.2.1 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能...

durban
昨天
1
0
OpenCV边缘检测算子原理总结及实现

1. 拉普拉斯算子 原理:是一种基于图像导数运算的高通线性滤波器。它通过二阶导数来度量图像函数的曲率。 拉普拉斯算子是最简单的各向同性微分算子,它具有旋转不变性。一个二维图像函数的拉...

漫步当下
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部