oracle 数据库负载高分析

时间:2022-04-04 14:09:40
数据库负载高故障排查处理:
问题描述:查看数据库负载高达20左右,大量进程占用cpu较高
问题分析:多个单进程占用cpu较高,一般为索引失效,sql复杂查询数据量大或存在锁行,锁表等
,分析数据库dwr报告:
发现大量的行级锁,已经锁等待占用cpu较高,查询数据库锁:select t2.username,t2.sid,t2.serial#,t2.logon_time,event
from v$locked_object t1,v$session t2
where 
t1.se ssion_id=t2.sid order by t2.logon_time desc
发现大量的行级锁

查询锁的进程对应的SQL语句为:
select /*+ ORDERED*/
 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.sid='897')
查出结果为:
数据库某块逻辑存在大量行级锁
行级锁导致原因大致分为以下几种:
1、不同的session同时更新或删除同一个记录
2、表上存在主键或唯一索引,会话1插入一个值(未提交),会话2同时或随后也插入同样的值
3、更新位图索引的一个键值,会指向多行记录,所以更新一行就会把该键值指向的所有行锁定
经排查为第一种情况导致,深入分析为恒通宜信网关多条数据返回同一
个sendid,大并发情况下,更新同一行记录,导致行级锁引发的数据库负载剧增
问题处理:
避免多线程同时操作同一行记录即可