这是一套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