Oracle占⽤cpu过⾼的处理办法
问题描述:
今天上午10点多,公司⽹络断了⼀会,过了⼤约⼗来分钟,⽹⼯处理好了,可数据库这下⼦可撑不住了,打开linux top查看了⼀下CPU百分百了,这可能是因为缓冲在客户端的数据⼀下⼦全传上来了导致数据库压⼒过⼤,可以前没有出现过这种问题,于是进⾏了分析和处理,以下为处理过程:
问题分析:
⼀般cpu占⽤效⾼都是排序、sql解析和全表扫描,这⾥⾸先需要出占⽤cpu最⾼的sql,然后查看他的执⾏计划,⽐如:看执⾏计划是⾛索引还是全表扫描(刚开始查看top发现占⽤同样多的CPU的进程很多,还以为是oracle 的bug, 后来发现不是)。
处理过程:
1, 根据操作系统进程查Oracle数据库中占⽤最多CPU的SQL
使⽤Linux系统 "top命令->P "查出占⽤cpu最⾼的进程PID
操作如下:在sqlplus中执⾏如下sql:
SQL>
SELECT
sql_text
FROM v$sqltext a
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
数据库优化sql语句
其中&pid 是使⽤top 查看系统中进程占⽤CPU极⾼的PID
到SQL语句进⾏相应的调整优化
2,分析到的sql语句,如查看sql执⾏计划。
总结:
这⾥的问题是查询的where 条件字段没有在索引⾥⾯,导致查询慢。经过重建并增加相关字段到索引解决,但有点疑惑的是原来库上查询语句⾥where条件字段也没有在索引⾥⾯(新库是使⽤expdp导出再导⼊到新库的),查询还正常,CPU也不⾼,oracle数据库真是博⼤精深,好多问题还有待研究。
另外复合索引⼀定要匹配查询的where条件,不然oracle不会⾛引索。
附:⼀般cpu占⽤效⾼都是排序、sql解析和全表扫描。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。