一次SQL优化记录
浏览:5057次 出处信息
在给客户巡检时,发现一个用PL/SQL Developer执行的效率低下SQL,如下:
SQL语句如下:
UPDATE TS_R_ORDER_DAY_004_TEMP A
SET USER_TAG =
(select z.USER_TAG
from (SELECT USER_TAG,
ORDER_ID,
ROW_NUMBER() OVER(PARTITION BY ORDER_ID ORDER BY CLCT_DAY DESC) RN
FROM TS_UH_ORDER_GOODS) z
where A.ORDER_ID = z.ORDER_ID
and rn = 1)
WHERE EXISTS
(SELECT 1 FROM TS_UH_ORDER_GOODS X WHERE A.ORDER_ID = X.ORDER_ID)
SQL执行计划如下:
通过执行计划可以看到,对Cost影响较大部分为IDX_TS_UH_ORDER_GOODS_1表的索引跳扫,Cost值157,虽然只有157,但是对走索引来说,157的Cost已经很大了,如果正常索引扫,这个值会小很多,而且INDEX SKIP SCAN的结果和HASH JOIN SEMI循环,导致总Cost达到287M(100),如果能将索引跳扫的Cost从157降下来,INDEX SKIP SCAN的结果和HASH JOIN SEMI循环的总Cost就会成几何下将,这个SQL优化重点也是使索引跳扫改成正常索引扫,猜测产生索引跳扫的原因可能是IDX_TS_UH_ORDER_GOODS_1表上存在复合索引,而该表的ORDER_ID列不是复合索引的第一列,解决方法:在IDX_TS_UH_ORDER_GOODS_1表的ORDER_ID列上单独建立索引。
但是无法接触客户的生产环境,只能给客户建议,至于客户会不会按照建议调试就是未知数了,而且这个SQL只执行了一次,也许这个SQL的运行时间客户是可以接受的,期待客户反馈。
建议继续学习:
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:master_pos_wait函数与MySQL主从切换
后一篇:从load data引发的死锁说起 >>
文章信息
- 作者:streamsong 来源: 信春哥,系统稳,闭眼上线不回滚
- 标签: SQL优化
- 发布时间:2012-10-22 21:53:05
建议继续学习
近3天十大热文
- [55] IOS安全–浅谈关于IOS加固的几种方法
- [53] Oracle MTS模式下 进程地址与会话信
- [53] 如何拿下简短的域名
- [51] 图书馆的世界纪录
- [51] android 开发入门
- [50] 【社会化设计】自我(self)部分――欢迎区
- [47] Go Reflect 性能
- [46] 读书笔记-壹百度:百度十年千倍的29条法则
- [42] 视觉调整-设计师 vs. 逻辑
- [39] 界面设计速成