这是一套Windows RAC的环境,也是之前处理 解决一则row cache lock引起的性能故障 那套环境。下面记录一下处理的经过:
1 对这一个小时进行AWR的收集和分析,首先,从报告头中看到DB Time达到近500分钟,(DB Time)/Elapsed=8,这个比值偏高:
2 再看TOP 5事件:
看到排在第一位的是enq: TX – row lock contention事件,也就是说系统中在这一个小时里产生了较为严重的行级锁等待事件。
Top 5 Timed Events
通常,产生enq: TX – row lock contention事件的原因有以下几种可能:
■不同的session更新或删除同一条记录;
■唯一索引有重复索引;
■位图索引同时被更新或同时并发的向位图索引字段上插入相同字段值;
■并发的对同一个数据块上的数据进行update操作;
■等待索引块完成分裂;
同时,从段的统计信息章节中,也看到下面的信息:
■% of Capture shows % of row lock waits for each top segment compared
■with total row lock waits for all segments captured by the Snapshot
看到row lock waits发生在一个索引上。
3 那么,究竟是什么操作导致了这个enq: TX – row lock contention等待事件呢? 查看系统中,当前有哪些会话产生了enq: TX – row lock contention等待事件?
view sourceprint?
01 SQL> select event,sid,p1,p2,p3 from v$session_wait where event='enq: TX - row lock contention';
02
03 EVENT SID P1 P2 P3
04 ---------------------------------------------------------------- ---------- ---------- ---------- ----------
05 enq: TX - row lock contention 224 1415053316 1441815 144197
06 enq: TX - row lock contention 238 1415053316 1441815 144197
07 enq: TX - row lock contention 247 1415053316 1441815 144197
08 enq: TX - row lock contention 248 1415053316 1441815 144197
09 enq: TX - row lock contention 253 1415053316 1441815 144197
10 SQL>
看到SID为224,238,247,248,253的会话产生enq: TX – row lock contention等待事件。
4 查看系统中的当前会话,是在哪个对象上产生了产生了enq: TX – row lock contention等待事件?
view sourceprint?
01 SQL> select ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW# from v$session where event='enq: TX - row lock contention';
02
03 ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#
04 ------------- -------------- --------------- -------------
05 369195 0 0 0
06 369195 0 0 0
07 369195 0 0 0
08 369195 0 0 0
09 369195 0 0 0
10 369195 0 0 0
11
12 6 rows selected
13 SQL>
5 那么这个数据库对象为369195的对象究竟是什么呢?
view sourceprint?
01 SQL> select object_name,object_id from dba_objects where object_id=369195;
02
03 OBJECT_NAME OBJECT_ID
04 ----------------------------------- ----------
05 BIND_PROCESS_LOG_REFNO 369195
06 SQL> select OWNER,OBJECT_NAME,OBJECT_ID,DATA_OBJECT_ID, OBJECT_TYPE from dba_objects where object_name='BIND_PROCESS_LOG_REFNO';
07
08 OWNER OBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
09 ------------------------------ ----------------------------- ---------- -------------- -------------------
10 SUNISCO BIND_PROCESS_LOG_REFNO 369195 369195 INDEX
11 SQL>
可以看到,定位到的结果同上述AWR报告中段统计信息吻合,是SUNISCO这个用户下的一个索引。
6 接下来,继续看看SID为224,238,247,248,253的会话到底在执行哪些操作导致enq: TX – row lock contention等待事件?
view sourceprint?
01 SQL> select sid,sql_text from v$session a,v$sql b where sid in(224,238,247,248,253) and (b.sql_id=a.sql_id or b.sql_id=a.prev_sql_id);
02
03 SID SQL_TEXT
04 ---------- --------------------------------------------------------------------------------
05 224 select count(1) from EDI_MESSAGE_PROCESS_LOG where (LOG_ID = :P_0_0 )
06 224 INSERT INTO EDI_MESSAGE_PROCESS_LOG(LOG_ID, SERVICE_TYPE, SERVICE_STATUS, INFO_C
07 238 select count(1) from EDI_MESSAGE_PROCESS_LOG where (LOG_ID = :P_0_0 )
08 238 INSERT INTO EDI_MESSAGE_PROCESS_LOG(LOG_ID, SERVICE_TYPE, SERVICE_STATUS, INFO_C
09 247 INSERT INTO EDI_MESSAGE_PROCESS_LOG(LOG_ID, SERVICE_TYPE, SERVICE_STATUS, REFNO,
10 247 INSERT INTO EDI_MESSAGE_PROCESS_LOG(LOG_ID, SERVICE_TYPE, SERVICE_STATUS, REFNO,
11 248 INSERT INTO EDI_MESSAGE_PROCESS_LOG (LOG_ID, SERVICE_TYPE, SERVICE_STATUS, REFNO
12 248 INSERT INTO EDI_MESSAGE_PROCESS_LOG (LOG_ID, SERVICE_TYPE, SERVICE_STATUS, REFNO
13 248 SELECT SEQ_NEWID.NEXTVAL FROM DUAL
14 253 SELECT SEQ_NEWID.NEXTVAL FROM DUAL
15 253 INSERT INTO EDI_MESSAGE_PROCESS_LOG (LOG_ID, SERVICE_TYPE, SERVICE_STATUS, REFNO
16
17 11 rows selected
18
19 SQL>
看到有SQL_ID不同的SQL在同时向EDI_MESSAGE_PROCESS_LOG这张表执行INSERT操作。
oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html
转载于:https://blog.51cto.com/19880614/1254968