生产环境有一条sql语句执行比较频繁,占用了大量的cpu资源。原本执行需要花费11秒。在一次排查中引起了我的注意,决定看看cpu消耗到底在哪儿?
sql语句是比较简单的,通过查询SUBSCRIBER_FA_V是一个视图。在视图中关联了几个和业务核心表。

SELECT TO_CHAR(SUBSCRIBER_NO) SUBSCRIBER_ID,SUB_STATUS,SUB_STS_RSN_CD,TO_CHAR(SUB_STATUS_DATE, 'yyyyMMdd') SUB_STATUS_DATE,SUBSCRIBER_TYPEFROM SUBSCRIBER_FA_VWHERE BAN = :1AND ROWNUM <= :2AND SUB_STATUS NOT IN ('C', 'L', 'T')ORDER BY INIT_ACT_DATE, SUBSCRIBER_NO

如果想做sql检查,对于sql中传入的变量,sql monitor提供了很方便的功能。
Binds

很清晰看到正在执行的sql语句对应的变量值。

还是来看看执行计划。

性能瓶颈都在几个全表扫描和一个分析函数相关的rank操作中。毕竟返回的记录数只有1条。如果过多的资源都消耗在一些不正确的连接访问中,是完全可以避免的。

视图的内容如下:

SELECT xxxxxxx1 RANKFROM subscriber, distribute ed, channel cpcWHERE     cpc.pym_channel_no = ed.target_pcnAND ed.agreement_no = subscriber.subscriber_noAND eg_dist_type = 'D'AND ed.expiration_date IS NULLAND SUBSCRIBER.SUB_STATUS NOT IN ('C', 'L', 'T')UNIONSELECT xxxxxxxFROM (SELECT cpc.ban,subscriber.prim_resource_val,subscriber.init_act_date,SUBSCRIBER.CUSTOMER_ID,subscriber.subscriber_no,SUBSCRIBER.SUBSCRIBER_TYPE,SUBSCRIBER.SUB_STATUS,SUBSCRIBER.SUB_STS_RSN_CD,SUBSCRIBER.SUB_STATUS_DATE,SUBSCRIBER.EFFECTIVE_DATE,ROW_NUMBER ()OVER (PARTITION BY subscriber.subscriber_noORDER BYed.expiration_date, subscriber.subscriber_no DESC)AS RANKFROM subscriber, distribute ed, channel cpcWHERE     cpc.pym_channel_no = ed.target_pcnAND ed.agreement_no = subscriber.subscriber_noAND eg_dist_type = 'D'AND SUBSCRIBER.SUB_STATUS IN ('C', 'L', 'T'))WHERE RANK = 1

根据执行计划,出问题的正式标黄的union子句。
根据传入的参数,是可以走索引的,但是在Union子句中,嵌入了子查询,导致在整个视图在数据的访问中,先全表扫描整个子查询,然后再匹配传入的参数。
视图的内容是不能随便改的,可能在这种场景中合适,其他的相关查询就有问题了。
所以尝试把视图的内容直接转换成直接的sql,标黄的部分是做的相应改动。

select xxxxxxxfrom (SELECT xxxxxxx1 RANKFROM subscriber, event_distribute ed, csm_pay_channel cpcWHERE cpc.pym_channel_no = ed.target_pcnAND ed.agreement_no = subscriber.subscriber_noAND eg_dist_type = 'D'AND ed.expiration_date IS NULLAND SUBSCRIBER.SUB_STATUS NOT IN ('C', 'L', 'T')and cpc.ban = 10308170UNIONSELECT "SUBSCRIBER_NO","INIT_ACT_DATE","SUB_STATUS","SUB_STS_RSN_CD","SUB_STATUS_DATE","SUBSCRIBER_TYPE","RANK"FROM (SELECT subscriber.subscriber_no,SUBSCRIBER.INIT_ACT_DATE,SUBSCRIBER.SUBSCRIBER_TYPE,SUBSCRIBER.SUB_STATUS,SUBSCRIBER.SUB_STS_RSN_CD,SUBSCRIBER.SUB_STATUS_DATE,ROW_NUMBER() OVER(PARTITION BY subscriber.subscriber_no ORDER BY ed.expiration_date, subscriber.subscriber_no DESC) AS RANKFROM subscriber, event_distribute ed, csm_pay_channel cpcWHERE cpc.pym_channel_no = ed.target_pcnAND ed.agreement_no = subscriber.subscriber_noAND eg_dist_type = 'D'AND SUBSCRIBER.SUB_STATUS IN ('C', 'L', 'T')and cpc.ban = 10308170)WHERE RANK = 1)where SUB_STATUS NOT IN ('C','L','T') and rownum < 6ORDER BY INIT_ACT_DATE, SUBSCRIBER_ID

看似语句挺长的,但是走了索引执行效率还是很高的。

Elapsed: 00:00:00.01Statistics----------------------------------------------------------0  recursive calls0  db block gets22  consistent gets0  physical reads0  redo size857  bytes sent via SQL*Net to client520  bytes received via SQL*Net from client2  SQL*Net roundtrips to/from client3  sorts (memory)0  sorts (disk)1  rows processed

本文转自ICT时空dbasdk的博客,原文链接: 生产环境sql语句调优实战第三篇 ,如需转载请自行联系原博主。

生产环境sql语句调优实战第三篇相关推荐

  1. MySQL SQL语句调优

    SQL语句调优 文章目录 SQL语句调优 一.大批量插入数据 1. 主键顺序插入 2. 关闭唯一性校验 3. 手动提交事务 二.优化insert语句 三.优化order by语句 1. 环境准备 2. ...

  2. SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)

    SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行) 原文:SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行) 前言 本篇继续玩转模块 ...

  3. 3mysql优化之SQL语句调优

    文件在:E:\学习文档子目录压缩\数据库\mysql\mysql优化\蚂蚁\蚂蚁1\3mysql优化之SQL语句调优 或 我的网盘\我的笔记\学习文档子目录压缩\数据库\mysql\mysql优化\蚂 ...

  4. SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行)

    前言 前面几篇我们分析了关于SQL Server关于性能调优的一系列内容,我把它分为两个模块. 第一个模块注重基础内容的掌握,共分7篇文章完成,内容涵盖一系列基础运算算法,详细分析了如何查看执行计划. ...

  5. MySQL百万级、千万级数据多表关联SQL语句调优

    本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万级数据表关联查询第一页结果能在2秒内完成(真实业务告警系统优化结果). 希望读者能够理解 ...

  6. mysql面试关联查询语句_MySQL百万级、千万级数据多表关联SQL语句调优

    作者:成金之路 www.cnblogs.com/uttu/p/6384541.html 本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万 ...

  7. mysql俩个表之间关联语法_MySQL多表关联SQL语句调优

    本文不涉及复杂的底层数据结构,是通过explain解释SQL,并根据当前可能出现的情况,来做具体的优化,使百万级.千万级数据表关联查询第一页结果能在几秒内完成(真实业务告警系统优化结果).希望对您有一 ...

  8. mysql百万数据join_MySQL百万级、千万级数据多表关联SQL语句调优

    本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万级数据表关联查询第一页结果能在2秒内完成(真实业务告警系统优化结果). 希望读者能够理解 ...

  9. SQL语句调优 - 索引上的数据检索方法

    如果一张表上没有聚集索引,数据将会随机的顺序存放在表里.以dbo.SalesOrderDetail_TEST为例子.它的上面没有聚集索引,只有一个在SalesOrderID上的非聚集索引.所以表格的每 ...

  10. Mysql数据库 sql 语句调优

    转载于:https://www.cnblogs.com/modailin/p/7711607.html

最新文章

  1. API网关与zuul1.x与springcloud的三角关系
  2. AAAI21最佳论文Informer:效果远超Transformer的长序列预测神器???
  3. openURL的使用(iOS调用系统电话、浏览器、地图、邮件等)
  4. 一步一步学习ObjectDataSource--(3)
  5. [BZOJ4621]Tc605
  6. Vue 组件(二)父组件与子组件传递数据 之props
  7. Matlab图像分割
  8. 查看Android应用签名信息
  9. c语言编写好的程序运行自动退出,VS 2015 写的第一个c语言控制台程序,运行完程序就自动...
  10. 帝国采集发布-帝国免规则采集发布
  11. ARM公司为何如此成功
  12. CDN:BootCDN 项目列表-摘录-20180405
  13. 以太坊EVM智能合约交易信息中Input和Logs解码
  14. ZJOI2019Round#1
  15. 输出pdf文件的一个简单方法
  16. 见缝插针php源码,见缝插针 小游戏源码
  17. 并发编程 - Synchronized
  18. python汽车数据分析_用python对汽车油耗进行数据分析
  19. UBNT ER-4 配置IPsec实现不同网络互访
  20. 服务器硬盘和视频存储硬盘的区别,云存储与服务器硬盘存储的区别?

热门文章

  1. Atitit 集成之道 attilax著 1. 所谓系统集成(SI,System Integration), 1 2. 发展方向 1 2.1. 产品技术服务型 2 2.2. 系统咨询型 2 2.3.
  2. Atiitt 可视化 报表 图表之道 attilax著 Atitit.可视化与报表原理与概论 1.  信息可视化 1 2. Gui可视化 2 2.1. atitit 知识的可视化.docx 2
  3. atitit 项目注册功能算法attilax总结.docx
  4. Atitit.加密算法ati Aes的框架设计v2.2
  5. Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结
  6. Atitit.跨语言数据库db  api兼容性 jdbc odbc ado oledb 增强方案
  7. paip.python错误解决8
  8. paip.invalid conversion from FormWdg* to SOCKET {aka unsigned int}
  9. paip.Image对象出现“对象当前正在其他地方使用或者GDI+中发生一般性错误的解决
  10. paip.css的覆盖