性能优化:两条SQL索引优化,CPU占用率从40%降至25%

news/2025/10/31 14:46:01/文章来源:https://www.cnblogs.com/www-htz-pw/p/19179786

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

一、问题背景:不寻常的CPU告警

近日,一位在医院工作的朋友找到我,说他们核心HIS系统的CPU使用率突然攀升至40%,而历史水平一直在20%左右,希望我能帮忙排查。凭借经验,我判断这很可能是一个典型的SQL性能问题。

果不其然,从分析到解决,整个过程不到10分钟。本文将完整复盘我的分析思路,希望能为大家提供一个高CPU消耗场景下的性能优化实战参考。

二、性能诊断

2.1 定位CPU消耗来源

接到问题后,我首先请朋友帮忙执行top命令,获取CPU使用率的详细分解。单纯一个“40%”的指标过于笼统,我们需要深入分析CPU时间的具体去向。

Cpu(s): 45.3%us,  2.5%sy,  0.0%ni, 50.8%id,  1.1%wa,  0.0%hi,  0.3%si,  0.0%st

我们重点关注以下三项:

  • us (user space):用户空间程序占用的CPU百分比。在我们的场景中,这主要指向Oracle数据库进程。
  • sy (system space):内核空间占用的CPU百分比,通常为操作系统内核、驱动等消耗。
  • wa (I/O wait):CPU等待I/O操作完成的时间百分比。

top的输出可以看到,用户空间(us)占用了高达45.3%的CPU,而系统内核(sy)和IO等待(wa)的占比都非常低。这清晰地表明:系统的IO性能没有瓶颈,问题根源在于Oracle数据库自身消耗了过多的CPU资源。

那么,什么情况下Oracle会消耗大量CPU而IO压力不大呢?常见原因包括:

  • 密集的内存运算:如大量的逻辑读(Logical Reads)、复杂的函数或表达式计算、高频的Mutex/Latch争用等。
  • 低效的程序代码:如循环嵌套、无谓计算的PL/SQL或Java存储过程。
  • 特定内部功能:如Oracle的In-Memory (IM) Columnar Store等。

在当前大内存服务器普及的背景下,这种“高CPU、低IO”的性能问题正变得越来越普遍。

2.2 锁定问题SQL

明确了方向后,我让朋友运行诊断脚本,重点关注处于ON CPU状态的会话及其执行的SQL。很快,我们就锁定了罪魁祸首,并通过关联v$active_session_history视图,获取了其执行计划和资源消耗情况。

****************************************************************************************
PLAN STAT FROM ASH
****************************************************************************************
SQL_ID  f0kfhaa3z2p0f, child number 0
-------------------------------------
SELECT  ID,JK,ZJ,YWRQ,REQJSON,MESSAGEDRGS,RESPJSON,ISUPLOAD,MARK,CREATED
TIME,MODIFIEDTIME,NOTE,JKCODE  FROM HT_HTZZ_HTZPWD  WHERE MARK='1'
AND (JKCODE = :1  AND ZJ = :2  AND ISUPLOAD = :3 )
Plan hash value: 1313371775
------------------------------------------------------------------------------------
| Id  | Operation         | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                |       |       |   117K(100)|          |CPU(2)(0%)                           |
|*  1 |  TABLE ACCESS FULL| TB_HMYY_UPLOAD |     1 |  1357 |   117K  (1)| 00:23:35 |CPU(92037)(100%)                     |
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(("ZJ"=:2 AND "JKCODE"=:1 AND "ISUPLOAD"=:3 AND "MARK"='1'))

执行计划一目了然:全表扫描(TABLE ACCESS FULL)CPU(92037)(100%)指标显示,几乎100%的成本都消耗在CPU上。这完美印证了我们之前的判断。

2.3 量化性能瓶颈

为了进一步确认创建索引的必要性,我们用数据说话。通过分析历史执行记录,我们得到了更精确的性能指标:

                                  PLAN            CPU      ELA      IO       ROWS     WRITE    GET      DISK     ROWS
END_TI I NAME               HASH VALUE EXEC       PRE EXEC PRE EXEC PER EXEC PRE EXEC PER EXEC PRE EXEC PRE EXEC PRE FETC
------ - --------------- ------------- ---------- -------- -------- -------- -------- -------- -------- -------- --------
16 09  1 HTZZ               1313371775 30         49.92s   50.09s   4.9ms    .97      0        45.13W   13.3     1
16 10  1 HTZZ               1313371775 30         51.45s   51.53s   .07ms    .97      0        45.13W   .17      1
16 10  1 HTZZ               1313371775 30         52.28s   53.37s   56.32ms  1        0        45.13W   138.93   1

关键数据解读:

  • ROWS PRE EXEC (每次执行返回行数):接近1。说明该查询非常高效,每次只返回极少数记录。
  • GET PRE EXEC (每次执行逻辑读):高达 45万。为了找出1行数据,却扫描了45万个数据块,这是典型的低效查询。
  • CPU PRE EXEC (每次执行CPU耗时):约50秒。巨大的CPU消耗完全源于海量的逻辑读。

数据不会说谎,全表扫描导致了“高逻辑读、低返回行”的性能灾难,创建索引势在必行。

2.4 选择索引列

那么,应该在哪一列上创建索引呢?WHERE子句涉及JKCODE, ZJ, ISUPLOAD, MARK四列。我们通过查询数据字典来分析这些列的选择性(selectivity)。

COLUMN                                                            NUM      NUM               AVG                     LAST
NAME                                     NL      DENSITY        NULLS DISTINCT  BUCK      COL LEN  SAMPLE_SIZE HIST  ANALYZED
---------------------------------------- -- ------------ ------------ -------- ----- ------------ ------------ ----- --------
ID(VARCHAR2(64))                         N             0            0  2264030     1          20     2,264,030 NONE  20250711
JK(VARCHAR2(128))                        Y             0           10        7     7          30         5,469 FREQU 20250711
ZJ(VARCHAR2(128))                        Y             0            0  2076160   254          46         5,469 HEIGH 20250711
YWRQ(DATE(7))                            Y             0            0   586496   254           8         5,469 HEIGH 20250711
REQJSON(CLOB(4000))                      Y             0            0        0     0         964     2,264,030 NONE  20250711
MESSAGEDRGS(NVARCHAR2(4000))             Y             0            0       22     1          18     2,264,030 NONE  20250711
RESPJSON(CLOB(4000))                     Y             0            0        0     0         244     2,264,030 NONE  20250711
ISUPLOAD(CHAR(1))                        Y             0            0        2     2           2         5,469 FREQU 20250711

NUM DISTINCT列显示了每列的唯一值数量。可以看到,ZJ列的唯一值数量(2,076,160)非常接近表的总行数(2,264,030),具有极高的选择性。因此,在ZJ列上创建索引是最佳选择。

三、解决方案:在线创建索引

考虑到这是在线业务系统,为避免影响正常运行,我们采用ONLINE方式创建索引。

create index hrip.ind_HT_HTZZ_HTZPWD_1 on hrip.HT_HTZZ_HTZPWD (ZJ)  online parallel 10 tablespace HTZZ;
alter index hrip.ind_HT_HTZZ_HTZPWD_1 noparallel;

四、总结与反思

索引创建后,效果立竿见影。系统CPU使用率迅速回落至正常水平。

Cpu(s): 27.1%us,  2.7%sy,  0.0%ni, 68.8%id,  1.2%wa,  0.0%hi,  0.2%si,  0.0%st

经了解,这两条问题SQL都源于一个新上线的业务模块。这次“小事故”也暴露了一个普遍存在于许多企业的典型问题:业务上线前缺乏充分的性能测试和SQL审核

这个案例虽然简单,但其反映的问题却值得我们深思。在此,我提出几点建议,希望能引起开发者、DBA和项目管理者的重视:

  1. 建立SQL审核制度:任何新功能或SQL变更上线前,都应由DBA或资深开发人员进行审核(Code Review)。重点关注查询是否使用了合适的索引、是否存在潜在的全表扫描、以及连接逻辑是否最优。

  2. 性能测试左移:不要把性能测试推到上线前的最后一环。开发人员在开发阶段就应该关注SQL性能,利用EXPLAIN PLAN分析执行计划,并在开发库中进行小规模的压力测试。

  3. 强化“数据导向”的优化思维:性能优化不能仅凭感觉。要善于利用数据库提供的性能视图(如AWR, ASH)和诊断工具,用数据定位瓶颈,用数据验证优化效果。

  4. 培养开发人员的数据库意识:开发人员是SQL的生产者,他们的代码质量直接决定了数据库的健康状况。企业应定期组织培训,提升开发团队的数据库基础知识,让他们理解索引原理、执行计划、事务隔离等核心概念。

幸运的是,强大的硬件和稳健的Oracle数据库为许多未经严格审查的业务提供了缓冲。但技术债终有需要偿还的一天。建立规范的开发、测试和上线流程,才是保障系统长期稳定、高效运行的根本之道。

------------------作者介绍-----------------------
姓名:黄廷忠
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/951809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 科技馆运维厂家企业推荐榜:专业力量守护科普阵地,博物馆运营,民防馆运营,展馆维保厂家推荐

随着全国科技馆年接待人次持续增长,科普场馆的稳定运行与体验升级愈发依赖专业运维服务。以下结合服务能力、技术特色与行业口碑,规模适中、专注细分领域的优质科技馆运维企业,为行业选择提供参考。 【推荐指数:★…

MyBatis中注册mapper的三种方式

MyBatis中注册mapper的三种方式 你接受吗

2025铜/铝/通信/光伏/风电/废旧/工地/橡套/电缆回收推荐榜:定兴广瑞五星领跑!京津冀绿色回收 + 高效拆解,3 企业凭工业 / 通讯 / 性价比显优势

随着 2025 年绿色循环理念普及、工业退役设备增多及环保合规要求升级,电缆回收从 “粗放式回收” 转向 “合规化流程、精细化拆解、资源化利用”,核心需求聚焦 “环保达标、回收效率、价值最大化”。综合合规资质、拆…

2025实用主板板卡厂家推荐榜:聚焦中小规模优质供应商,工控主板板卡,核心板主板板卡厂家推荐

随着工业自动化、物联网与智能硬件的快速发展,主板板卡作为设备核心部件,其稳定性与适配性直接影响终端产品体验。市场中众多中小规模厂家凭借精准的场景定位与扎实的技术积累,展现出独特优势。以下结合技术实力、场…

2025年武汉小型车出租厂家服务商推荐榜单,实用出行参考,防撞车出租,高空车出租,登高车出租厂家推荐

在武汉出行,无论是个人短途自驾、商务接待,还是家庭出游包车,小型车出租服务商凭借灵活的服务和适配性,成为不少人的选择。规模适中、口碑尚可的本地车出租相关服务商,从服务场景、核心优势等方面为大家提供参考,…

目前靠谱的除甲醛公司哪家好:2025年权威除甲醛服务对比分析

摘要 随着人们对室内空气质量关注度的提升,除甲醛行业在2025年迎来快速发展,市场规模预计增长15%以上(数据来源:中国室内环境监测中心)。消费者在选择除甲醛服务时,往往面临信息不对称和信任难题。本文基于专业评…

2025值得关注的小型面粉机厂家榜单,适配多场景加工需求,大型面粉机,石磨面粉机,杂粮面粉机厂家推荐

在粮食加工行业中,小型面粉机凭借灵活适配、操作便捷的优势,成为中小型加工厂、家庭作坊的核心设备。以下结合设备性能、行业口碑与应用场景,规模适中、特色鲜明的面粉机厂家,为行业从业者和采购者提供参考。 漯河…

2025年BAB筑垒建设公司权威深度解析:北京写字楼装修行业测评和未来趋势揭秘

引言:本文将从“设计创新与施工落地一致性”这一核心维度出发,为计划在北京进行高端写字楼装修的企业提供一份可落地的客观参考,避免“图纸惊艳、现场翻车”的普遍痛点。 背景与概况:筑垒建设(北京)有限公司,简…

哪款项目管理工具最能支撑IPD流程?深度解析飞书项目、Jira Align 与 Planview

本文深入探讨如何选择支持IPD(集成产品开发)流程的项目管理工具,并为您深度解析三款主流选择:面向大型企业的战略级平台 Jira Align,办公生态无缝集成、可视化程度极高的敏捷利器飞书项目,以及提供端到端解决方案…

2025汽车内饰/真空/常压/大气/等离子清洗机推荐榜:深圳东信高科自动化五星领跑!精密适配 + 多行业落地,3 企业凭半导体 / 大功率 / 性价比显优势

随着 2025 年电子元件、汽车零部件、新能源等领域对 “表面洁净度、工艺自动化” 要求升级,等离子清洗机作为去除微小污染物、提升材料附着力的核心设备,逐渐向 “精准控制、场景定制、高效节能” 方向发展。综合清洗…

Java 对象与类

Java 对象与类基础 在面向对象编程(OOP)中,“对象”是现实世界实体的抽象,“类”是对象的模板或蓝图。Java 作为纯面向对象语言,一切程序设计围绕“类与对象”展开。 面向对象核心概念 对象(Object) 对象代表现…

2025年BAB筑垒建设公司权威深度解析:北京写字楼装修行业测评与未来趋势揭秘

引言:本文将从“设计创新与深度”这一核心维度出发,为读者提供一份针对BAB筑垒建设公司在北京写字楼装修赛道中差异化竞争力的客观参考,避免泛泛而谈。 背景与概况:筑垒建设(北京)有限公司,简称“BAB筑垒”,是…

我敢说:EasyCVR「4G+太阳能+AI」才是防溺水监控的最优解!

前几天我去郊外河道调研,看到几个孩子在河边玩耍,心里顿时一紧。正当我准备上前提醒时,河边的摄像头突然响起了语音提示:“您已进入危险区域,请尽快离开。”孩子们互相看了看,乖乖地退到了安全地带。 这个小小的…

2025年不锈钢外六角螺栓制造企业权威推荐榜单:内六角螺栓/不锈钢螺栓/外六角螺栓源头厂家精选

不锈钢外六角螺栓作为一种基础但关键的工业紧固件,广泛应用于建筑、机械、化工和能源等领域,其耐腐蚀性、高强度特性对工程安全至关重要。随着市场需求增长,制造企业的综合实力成为用户选择的核心依据。本文基于行业…

leetcode274. H 指数

leetcode274. H 指数274. H 指数自己写的先排序后反向遍历class Solution {public int hIndex(int[] citations) {int n = citations.length;Arrays.sort(citations);if(citations[0] >= n) return n;if(citations…

2025年BAB筑垒建设公司权威深度解析:北京写字楼装修业测评与未来趋势揭秘

引言:本文从“全周期交付能力”这一核心维度出发,拆解BAB筑垒建设公司在写字楼装修赛道中的真实表现,为计划2025—2027年进行办公空间升级的企业提供一份可落地的客观参考。 背景与概况:筑垒建设(北京)有限公司,…

2025 年最新推荐:货梯源头厂家排行榜 防爆 / 升降 / 仓库 / 载货电梯靠谱品牌精选

引言 在工业制造与物流仓储行业高速发展的当下,货梯作为垂直货物运输的核心设备,其安全性能、运行稳定性与服务保障能力直接关系企业生产效率与运营安全。当前市场中,货梯厂家数量激增但资质与实力悬殊,部分厂家缺…

边缘智能的创新:MLGO微算法科技推出基于QoS感知的边缘大模型自适应拆分推理编排技术

在人工智能与网络边缘融合的浪潮下,企业正在加速推动以大型基础模型(Large Foundation Models, LFM)为核心的新一代边缘智能平台的落地。然而,在资源受限、网络条件动态变化且节点异构严重的多接入边缘计算(MEC)…

2025年10月绩效管理咨询公司推荐:榜单对比教你选

2025年10月,当企业准备启动年度战略复盘、预算排兵布阵或组织升级时,"绩效管理咨询公司"成为高频搜索词。用户场景大致有三:一是营收10-50亿元的制造型企业,订单波动大,希望把战略解码到一线绩效;二是…

Pinely Round 5 (Div.1 + Div.2)

噢噢噢噢噢噢噢噢哦哦啊啊啊啊啊啊啊啊啊啊A - E 题解。 A 考虑 \(R\) 一定是越小越好,这样可以尽可能让 Div.2 也 Rated,于是每次 Rated Round 都有 \(R \gets \max(0, R - D)\)。模拟即可。 B 神人 b 题。YES 只有…