还记得前面说需要将视图V$SESSION_WAIT和V$SESSION连接查询来获取关于会话的细节信息吗?在10g中,这将成为历史。10g中的视图V$SESSION也会显示和V$SESSION_WAIT一样的等待事件信息。以下便是V$SESSION用于显示会话当前所等待的等待事件而新增的字段。
这些字段和V$SESSION_WAIT中的是一样的,并且显示的信息也相同。这样就无需再查询V$SESSION_WAIT视图了,要获取到会话的等待信息就只需要查询一个视图就行了。EVENT# NUMBER EVENT VARCHAR2(64) P1TEXT VARCHAR2(64) P1 NUMBER P1RAW RAW(4) P2TEXT VARCHAR2(64) P2 NUMBER P2RAW RAW(4) P3TEXT VARCHAR2(64) P3 NUMBER P3RAW RAW(4) WAIT_CLASS_ID NUMBER WAIT_CLASS# NUMBER WAIT_CLASS VARCHAR2(64) WAIT_TIME NUMBER SECONDS_IN_WAIT NUMBER STATE VARCHAR2(19)
让我们看看前面这个例子:SID为269的会话正在等待事件enq: TX ?C row lock contention。这表示它正在等待另外一个会话持有的锁。要诊断这个问题,你就必须定位到另外一个会话。如何做呢?
在9i和以下版本中,你可能需要写一个复杂的查询来获取到持有锁的会话的SID。在10g中,你就只需要执行以下查询就可以了:
这个结果说明:SID为265的会话阻塞了会话269。SQL> select BLOCKING_SESSION_STATUS, BLOCKING_SESSION 2 from v$session 3 where sid = 269; BLOCKING_SE BLOCKING_SESSION ----------- ---------------- VALID 265
有多少等待?
有一个用户的会话一致在保持着,他的问题还没有得到满意的解决。为什么他的会话会保持这么长事件还没有完成呢?你可以通过以下查询来定位:
请注意关于这个会话等待的诸多信息。现在你就知道了这一会话已经等待和应用相关的等待事件共873次、261537厘秒,等待网络相关的事件15次,等等。SQL> select * from v$session_wait_class where sid = 269; SID SERIAL# WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS TOTAL_WAITS TIME_WAITED ---- ------- ------------- ----------- ------------- ----------- ----------- 269 1106 4217450380 1 Application 873 261537 269 1106 3290255840 2 Configuration 4 4 269 1106 3386400367 5 Commit 1 0 269 1106 2723168908 6 Idle 15 148408 269 1106 2000153315 7 Network 15 0 269 1106 1740759767 8 User I/O 26 1