在一次客户系统性能优化项目中,经过第一阶段的优化之后,数据库的DB Time和物理读都明显降低,但是我们发现CPU并没有明显降低。

对此,我方针对占用CPU较高的SQL进行了分析,并继续寻找优化空间。

找出占用CPU高的CPU有很多办法,比如:

通过操作系统高CPU消耗的Oracle进程,通过其 PID  和数据库内部视图 v$process ,v$session 关联,找到相关SQL。

通过 AWR 的历史信息,获取TOP CPU消耗的SQL列表,再针对性的分析

从思路二出发,首先通过查询 DBA_HIST_SQLSTAT 字典表,获取 CPU 按照使用率的SQL列表:

这其中排在最前列的主要是2条SQL语句,通过 v$sql 可以找到其SQL文本:

那么接下来的问题,就是分析这两条SQL,找到提升其效率的办法。

两条SQL共占用CPU TIME 30%以上。这两条SQL基本一致,只是mod一个字段的值不同,一个筛选mod之后为1的数据,一个筛选mod之后为0的数据。经验证这两条SQL解决方法一致,以其中一条为例。

select * from GBORDDDRETURN_UP_SCAN t

where mod(SEQ_ID, 2)=1  and status >0

and upload_state = 0 and work_type

in('10', '11', '12', '13', '20') and rownum <= 200

order by done_date

该SQL的执行统计信息如下,单次执行需要接近 5s 时间,消耗逻辑读 125,887,而平均每次执行返回 0.01 行,也就是说绝大多数查询是不返回满足条件的结果的。而如果 1393 次执行,只返回 10 行记录,那么单次的逻辑读消耗就显得高的可怕。这也是高 CPU 消耗的原因。

考察一下执行计划,可以看到一个索引被使用到,很多时候我们认为走索引就问题不大,这个常规判断在这里显然不成立,这个效率不高的索引是高逻辑读的主要原因。

我们再来分析一下表的元数据,可以看到现有索引的效率不佳,过滤性极差:

那么我们继续分析一下查询中的其他条件,以期望尽快的筛选记录,减少逻辑读。

通过分析我们注意到,虽然status和upload_state字段单独的过滤性都很差,但是放在一起却是一个非常好的条件。这两个条件可以快速筛选:

在创建了新的索引之后,可以看到整个SQL的执行效率大大提升:

建立该索引之后,执行时间由4966 ms降低到10m秒以内。逻辑读由125887降低到10以下。系统的CPU消耗得以快速消减。

这个案例给我们的启示是:

有效的索引才是好的索引;

如果单行查询逻辑读过高,一定需要对SQL进行单独的审核和优化;

多看多知,这就是实战课堂。


资源下载

关注公众号:数据和云(OraNews)回复关键字获取

2018DTCC , 数据库大会PPT

2017DTC,2017 DTC 大会 PPT

DBALIFE ,“DBA 的一天”海报

DBA04 ,DBA 手记4 电子书

122ARCH ,Oracle 12.2体系结构图

2017OOW ,Oracle OpenWorld 资料

PRELECTION ,大讲堂讲师课程资料

实战课堂:系统CPU高消耗的SQL筛选和最佳索引优化相关推荐

  1. 实战课堂:数据库高Library Cache Lock导致Hang的故障分析

    编辑手记:在现实的生产环境中,DBA可能遭遇到各种各样的异常,或简单.或复杂,但是无一不考验DBA的经验和能力,在『实战课堂』栏目中,我们将整理和分享来自云和恩墨一线的各种案例,以其帮助走在DBA道路 ...

  2. MySQL性能优化:SQL慢查询优化,索引优化,表优化

    1. MySQL优化概述 MySQL 优化是一个综合性的技术,在优化上存在着一个调优金字塔的说法,如下: 很明显从图上可以看出,越往上走,难度越来越高,收益却是越来越小的.比如硬件和 OS 调优,需要 ...

  3. linux应用系统使用率,Linux性能优化实战:系统CPU使用率高,但为啥找不到高的应用(06)...

    一.环境准备 1.安装软件包 终端1 机器配置:2 CPU,8GB 内存 预先安装 docker.sysstat.perf等工具 1 [root@luoahong ~]#docker -v 2 Doc ...

  4. 实战课堂:一则CPU 100%的故障分析处理知识和警示

    编辑手记:在现实的生产环境中,DBA可能遭遇到各种各样的异常,或简单.或复杂,但是无一不考验DBA的经验和能力,在『实战课堂』栏目中,我们将整理和分享来自云和恩墨一线的各种案例,以其帮助走在DBA道路 ...

  5. linux 使cpu使用率升高_关于linux系统CPU篇---gt;CPU使用率升高

    1.CPU使用率为单位时间内CPU使用情况的统计,以百分比的方式展示. LINUX作为一个多任务操作系统,将每个CPU的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运 ...

  6. Linux性能优化从入门到实战:04 CPU篇:CPU使用率

      CPU使用率是单位时间内CPU使用情况的统计,以百分比方式展示. $ top top - 11:46:45 up 7 days, 11:52, 1 user, load average: 0.00 ...

  7. Linux 系统 CPU 使用率简单分析

    CPU 使用率是单位时间内 CPU 使用情况的统计,以百分比的方式展示. CPU 使用率 为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 ...

  8. mysql sql tuning_使用SQL tuning advisor(STA)自动优化SQL

    Oracle 10g之后的优化器支持两种模式,一个是normal模式,一个是tuning模式.在大多数情况下,优化器处于normal模式.基于CBO的n Oracle 10g之后的优化器支持两种模式, ...

  9. linux性能优化实战 倪朋飞,Linux性能优化实战:系统的swap变高(09)

    一.实验环境 1.操作系统 root@openstack:~# lsb_release -a No LSB modules are available. Distributor ID:Ubuntu D ...

最新文章

  1. 【activeMQ】一、入门
  2. python中的open函数实例_Python中open函数注意点
  3. vb Select Case的使用 字符串整形的转换 输入错误str的直接输出
  4. 15行Python 仿百度搜索引擎
  5. 工作中的javascript代码收集及整理
  6. PAT1002. 写出这个数
  7. idea在Sonar中点击exclude后恢复
  8. python docx 表格打印不显示_python-docx 设置 word 文档中表格格式
  9. java top tree 数据结构_Java中如何实现Tree的数据结构算法
  10. python制作指定区域截图工具_用python实现选择截图区域
  11. 《平凡的世界》造就不平凡的人生 --路遥
  12. 白泽六足机器人导航贴(开源)
  13. 什么是全栈工程师,如何成为全栈工程师
  14. 笔记本电脑装固态硬盘和内存
  15. GhostXP_SP3完整纯净版V3.5 By songyongzhi
  16. 测试下1K个宏和程序运行空间大小的关系
  17. Linux列出磁盘信息
  18. 自动驾驶算法的KPI指标(精确率、召回率及准确率)
  19. Security配置
  20. HTML加js实现计算文件哈希值,HTML5 File API 配合 Web Worker 计算大文件 SHA3 Hash 值

热门文章

  1. 世界卫生组织高血压防治指南_建立对团队和组织的信任的指南
  2. word文档保存发生错误_文档还是没有发生
  3. (22)css3新增边框圆角属性border-radius
  4. ROS笔记(25) 自主探索SLAM
  5. php之微型博客创建,php之微型博客的创建
  6. 您的浏览器缺少对java的支持_windows10 登录vpn提示:您的浏览器没有得到JVM支持。请安装JVM1.5或以上版本--解决方案...
  7. python如何调用xpath_Python案例:使用XPath的爬虫
  8. bagging和时间序列预测_时间序列多步预测的五种策略
  9. 硬件创新需要去理解的点(精炼总结)
  10. 最大连续1的个数 三 窗口大小固定,逻辑连续但实际上并不连续的滑动窗口