oracle cpu占用率高

oracle cpu占用率高

Oracle CPU 占用率高可能由多种原因导致,例如大量排序、大量 SQL 解析、全表扫描等。以下是一般的排查和解决步骤:
排查思路:找到占用 CPU 较高的进程或线程 ID,进而找到对应的 SQL 语句,以分析问题的原因。
处理步骤(以 Windows 系统为例)

  1. 下载 process explorer 工具,用于查看 Windows 环境下的进程和线程信息。
  2. 双击 oracle.exe 进程,查看 oracle 的线程信息,按照 CPU 使用率倒序排序,找到占用 CPU 较高的 tid。(如果是 Unix 或 Linux 系统,可以使用 top 命令获得占用 CPU 较高的进程 id,然后使用进程 id 在数据库中查找对应信息。)
  3. 使用找到的 tid 代入以下的 SQL 查询对应的 SQL 语句或会话信息:
    • select sql_text from v$sqltexta where (a.hash_value,a.address) in (select decode(sql_hash_value,0,prev_hash_value,sql_hash_value),decode(sql_hash_value,0,prev_sql_addr,sql_address) from v$session b where b.paddr=(select addr from v$process c where c.spid='&pid')) order by piece asc;
    • select id,serial#,username,osuser,machine,program,process,to_char(logon_time,'yyyy-mm-dd hh24:mi:ss') logon from v$session where paddrin (select addr from v$process where spid in ('&pid'));

  4. 根据查出的会话,记录 SQL 语句以待后续分析,并考虑 kill 掉查出的会话。

优化方法
  • 分析找到的 SQL 语句,查看其执行计划,确定是否存在全表扫描等问题,如有必要,进行优化,例如创建适当的索引以加速查询。
  • 检查数据库中的查询和存储过程,看是否存在可以优化的逻辑。
  • 调整数据库参数,如优化内存使用等,但需谨慎操作,确保了解参数的具体作用。
  • 检查硬件问题,确保服务器硬件满足数据库的要求,如有需要,考虑升级硬件。

如果问题仍然存在,可能需要更深入地分析数据库的活动,例如查看等待事件、检查是否存在死锁等。另外,不同的数据库环境和具体情况可能需要不同的解决方法,上述步骤仅提供了一般的指导。如果可能,也可以参考 Oracle 官方文档或咨询专业的数据库管理员以获取更准确的解决方案。


如果你需要针对特定场景的更详细的解决方法,或者在排查过程中遇到了具体的问题,可以提供更多信息,以便我能更好地帮助你解决 Oracle CPU 占用率高的问题。
同时,也有一些网友分享了他们处理 Oracle CPU 占用率高的经验,供你参考:
博主 “癫狂编程” 在一次公司网络中断恢复后,遇到了数据库 CPU 占用率百分百的情况。他使用 Linux 系统的 “top 命令 ->p” 查出占用 CPU 最高的进程 pid,然后在 sqlplus 中执行以下 SQL 语句找到占用 CPU 最多的 SQL:
收起


oracle cpu占用率高

sql

复制

sql_text v$sqltexta ahash_valueaaddress decodesql_hash_valueprev_hash_valuesql_hash_valuedecodesql_hash_valueprev_sql_addrsql_address v$sessionb bpaddr addr v$processc cspid piece
其中&pid是使用 top 查看系统中进程占用 CPU 极高的 pid。博主发现问题是查询的 where 条件字段没有在索引里面,导致查询慢。经过重建并增加相关字段到索引解决。
博主 “拜托拜托” 由于公司没有 DBA,遇到数据库问题只能自己排查。他首先查询是否存在死锁,杀掉死锁后发现 CPU 没有降下来;然后借助 PLSQL 查询定时 JOB 和 session,kill 了所有 session 后 CPU 得到缓解,但根本原因未查到,隔几分钟又反复了;最后查询数据库中的等待事件,发现存在等待事件,分析待执行的 SQL 发现存在多表(百万数据)全量关联查询,于是对数据以及 SQL 进行了相应优化,CPU 占用较高问题得到根本解决。
博主 “蒋健” 在处理 CPU 使用率频频 100% 又没有明显 TOP SQL 的问题时,先进行应急处理,杀掉一批没有事务的会话以保证业务;然后分析 AWR 报告,但没有找到明显的 TOP SQL;接着判断是否是硬解析导致 TOP SQL 不明显,发现即使强制绑定变量后,TOP SQL 也不突出;再换个角度从对象层面进行突破,发现 top1 只占 16%,说明想优化两三个 SQL 解决问题不太现实;最后通过查看 top5 等待事件,发现问题可能出在存储上,但由于logfileparallelwrite的高延迟在 CPU 使用率高时并不准确,更多信息需参考 Oracle support 的文档。最终选择从优化物理读消耗多的 SQL 入手,定位到 top segment 后,在三张表上建立四条索引,解决了 CPU 过高的问题。
如果你使用的是 Windows 系统,还可以参考博主 “jijm123” 的方法。他使用 qslice 工具来分析进程的 CPU 占用率。具体步骤为:进入 qslice 后打开 oracle 进程,双击进入并最大化弹出的窗口,观察几分钟揪出频繁出现的 tid;然后使用该 tid 进行查询问题 SQL,语句如下:
收起


sql

复制

sql_text v$sqltexta ahash_valueaaddress decodesql_hash_valueprev_hash_valuesql_hash_valuedecodesql_hash_valueprev_sql_addrsql_address v$sessionb bpaddr addr v$processc cspidto_number piece
不过 qslice 已无法从微软官网下载,你可以从博主提供的链接(https://files.cnblogs.com/files/pcsky/qslice.rar)下载。

看过该文章的人还看了