现场有可能出现这样的情况,实施同事修改数据后,忘记提交了(特别是新人最容易出现这种情况),从数据库报告的表象如下,一个极其简单的update产生了大量的等待(取当时的执行计划,是走了索引),其实它是被冤枉的:
Snap Id | Snap Time | Sessions | Cursors/Session | |
---|---|---|---|---|
Begin Snap: | 32195 | 27-May-13 11:00:55 | 95 | 24.7 |
End Snap: | 32196 | 27-May-13 12:00:08 | 105 | 8.6 |
Elapsed: | 59.22 (mins) | |||
DB Time: | 400.72 (mins) |
Event | Waits | Time(s) | Avg Wait(ms) | % Total Call Time | Wait Class |
---|---|---|---|---|---|
enq: TX - row lock contention | 7,526 | 22,061 | 2,931 | 91.8 | Application |
CPU time | 1,376 | 5.7 | |||
db file sequential read | 199,193 | 241 | 1 | 1.0 | User I/O |
SQL*Net break/reset to client | 517 | 188 | 364 | .8 | Application |
db file scattered read | 95,642 | 75 | 1 | .3 | User I/O |
Elapsed Time (s) | CPU Time (s) | Executions | Elap per Exec (s) | % Total DB Time | SQL Id | SQL Module | SQL Text |
---|---|---|---|---|---|---|---|
22,062 | 0 | 570 | 38.70 | 91.76 | 3a4rqqahh9n2q | UPDATE GG_RUNLOG_RUN_REC_DET... |
模拟当时的情况,通过脚本查出产生堵塞的会话和被堵塞的会话,不过可惜的是,产生堵塞会话的SQL找不到:
session1:
select * from test where object_id = 20 for update;
session2:
select * from test for update;
session3:
SELECT bs.username "Blocking User",
bs.username "DB User",
bs.SID "SID",
bs.serial# "Serial#",
bs.sql_address "address",
bs.sql_hash_value "Sql hash",
bs.program "Blocking App",
bs.machine "Blocking Machine",
bs.osuser "Blocking OS User",
bs.serial# "Serial#",
ws.username "Waiting User",
ws.SID "WSID",
ws.program "Waiting App",
ws.machine "Waiting Machine",
ws.osuser "Waiting OS User",
ws.serial# "WSerial#",
wk.TYPE lock_type,
hk.lmode mode_held,
wk.request mode_requested,
TO_CHAR(hk.id1) lock_id1,
TO_CHAR(hk.id2) lock_id2,
hk.BLOCK blocking_others
FROM v$lock hk, v$session bs, v$lock wk, v$session ws
WHERE hk.BLOCK = 1
AND hk.lmode != 0
AND hk.lmode != 1
AND wk.request != 0
AND wk.TYPE(+) = hk.TYPE
AND wk.id1(+) = hk.id1
AND wk.id2(+) = hk.id2
AND hk.SID = bs.SID(+)
AND wk.SID = ws.SID(+)
AND (bs.username IS NOT NULL)
AND (bs.username <> 'SYSTEM')
AND (bs.username <> 'SYS')
ORDER BY 1;
Blocking User | TEST |
DB User | TEST |
SID | 13 |
Serial# | 12 |
address | 0 |
Sql hash | 0 |
Blocking App | PlSqlDev.exe |
Blocking Machine | COMTOP\HLPNT2X |
Blocking OS User | COMTOP\guogang |
Serial# | 12 |
Waiting User | TEST |
WSID | 18 |
Waiting App | PlSqlDev.exe |
Waiting Machine | COMTOP\HLPNT2X |
Waiting OS User | COMTOP\guogang |
WSerial# | 6 |
LOCK_TYPE | TX |
MODE_HELD | 6 |
MODE_REQUESTED | 6 |
LOCK_ID1 | 196641 |
LOCK_ID2 | 1548 |
BLOCKING_OTHERS | 1 |