[20171120]理解v$session的state欄位
[20171120]理解v$session的state欄位(11G).txt
--//https://blogs.oracle.com/database4cn/vsession-%e4%bd%a0%e7%9c%8b%e5%88%b0%e7%9a%84event%e7%9c%9f%e7%9a%84%e6%98%afsession%e5%bd%93%e5%89%8d%e7%9a%84%e7%ad%89%e5%be%85%e4%ba%8b%e4%bb%b6%e4%b9%88-v2
--//v$session - 你看到的event真的是session當前的等待事件麼?
--//我重複測試,其內容直接轉抄作者的連結:
SCOTT@book> @ ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
--//sesson 1:
SCOTT@book> @ &r/spid
SID SERIAL# PROCESS SERVER SPID PID P_SERIAL# C50
---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------
274 5 53785 DEDICATED 53786 21 3 alter system kill session '274,5' immediate;
--//記下sid=274.
SCOTT@test01p> exec loop null; end loop;
--//死迴圈.
--//sesson 2:
SCOTT@book> @ &r/wait
no rows selected
--//嗯,沒有輸出,看來我的檢測指令碼要修改看看.
SCOTT@book> select sid,serial#,status,sql_id,event,seq# from v$session where sid=274;
SID SERIAL# STATUS SQL_ID EVENT SEQ#
---------- ---------- -------- ------------- ---------------------------------------- ----------
274 5 ACTIVE 61bj68pvygxvz SQL*Net message from client 40
SCOTT@book> @ &r/sqlid 61bj68pvygxvz
SQL_ID SQLTEXT
------------- --------------------------------
61bj68pvygxvz BEGIN loop null; end loop; END;
您會發現以上這個session竟然會在 "等待" SQL*Net message from client,並且status為ACTIVE,大家都知道SQL*Net message from
client是一個空閒等待,代表server process正在等待client發出下一個sql指令。
接下來觀察以上以上程式的CPU消耗情況,會發現它在持續的ON CPU
$ top -p 53786 -b
top - 11:03:32 up 711 days, 2:26, 1 user, load average: 1.21, 0.62, 0.37
Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 1.0%sy, 0.0%ni, 98.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 132261196k total, 113979744k used, 18281452k free, 1122908k buffers
Swap: 31455264k total, 2300k used, 31452964k free, 108723604k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
53786 oracle 20 0 849m 27m 23m R 99.8 0.0 2:07.03 oracle
--//它幾乎消耗了一個的CPU.
那麼問題來了,這個如此燒CPU的死迴圈session怎麼會是處於空閒等待?答案是我們忽略了v$session.state這個非常重要的列。
一個session的狀態要麼是在等待,要麼是在ON CPU,v$session.state這個列可以判斷這個狀態。有且只有v$session.state='WAITING'
的時候,才代表這個session當前正在等待這個event,否則代表這個session在ON CPU,並且觀察到的event只是程式在ON CPU之前的最後
一個等待。
接下來我們將以上用於查詢session等待的SQL改一下,新增上v$session.state這個列:
SCOTT@book> select sid,serial#,status,state,sql_id,event,seq# from v$session where sid=274;
SID SERIAL# STATUS STATE SQL_ID EVENT SEQ#
---------- ---------- -------- ------------------- ------------- ---------------------------------------- ----------
274 5 ACTIVE WAITED KNOWN TIME 61bj68pvygxvz SQL*Net message from client 40
可見STATE的值為"WAITED KNOWN TIME",不是"WAITING",這表明這個session當前在ON CPU,"SQL*Net message from client"只是這個
session在ON CPU之前的最後一個等待。因此當您查詢v$session觀察session的等待事件的時候,一定不要忘了v$session.state這個關鍵
列。
--//看來給修改我的檢測指令碼:
select p1raw,p2raw,p3raw,p1,p2,p3,sid,serial#,seq#,event,state,wait_time_micro,seconds_in_wait
from v$session where wait_class<>'Idle'
and sid not in (select sid from v$mystat where rownum=1)
order by event ;
--//修改如下:
select p1raw,p2raw,p3raw,p1,p2,p3,sid,serial#,seq#,event,status,state,wait_time_micro,seconds_in_wait
from v$session where ( wait_class<>'Idle' or (status='ACTIVE' and STATE='WAITED KNOWN TIME'))
and sid not in (select sid from v$mystat where rownum=1)
order by event ;
SCOTT@book> @ &r/wait
P1RAW P2RAW P3RAW P1 P2 P3 SID SERIAL# SEQ# EVENT STATUS STATE WAIT_TIME_MICRO SECONDS_IN_WAIT
---------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------------------------------- -------- ------------------- --------------- ---------------
0000000062657100 0000000000000001 00 1650815232 1 0 274 5 40 SQL*Net message from client ACTIVE WAITED KNOWN TIME 15932642 357
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2147486/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- v$process和v$session中欄位解釋Session
- v$session中command欄位的含義解析Session
- v$session與v$sql連線現在使用哪個欄位?SessionSQL
- Oracle 動態效能表 v$session & v$process各個欄位的說明OracleSession
- v$session--X$KSUSE s,X$KSLED e欄位對應Session
- 理解V$LOCK.ID1和ID2欄位的含義
- 關於v$process與v$session中process的理解Session
- V$SESSION中的saddr,paddr,taddr 與v$process及v$transaction中欄位的關係Session
- 理解V$OPEN_CURSOR, V$SESSION_CACHED_CURSORSession
- [20171102]檢視v$session中process欄位含義Session
- ElasticSearch 5.3原始碼學習 —— Cluster State 欄位詳解Elasticsearch原始碼
- Session State and Referenced Packages (246)SessionPackage
- [zt] 理解V$OPEN_CURSOR, V$SESSION_CACHED_CURSORSession
- v$session中LAST_CALL_ET引數的理解SessionAST
- 理解V$OPEN_CURSOR,SESSION_CACHED_CURSORSession
- 【Oracle】-【v$session】v$session的SNIPED狀態OracleSession
- 如何理解 package.json 中的 proxy 欄位?PackageJSON
- session bean中的session如何理解?SessionBean
- SAP MM ‘Pricing Date Control‘欄位的理解
- Flutter State 深入理解Flutter
- V$SESSIONSession
- 【SESSION】v$session and v$license 中sessions_current 的區別Session
- pydantic 欄位欄位校驗
- v$session的解釋Session
- v$session的來源Session
- v$session中的serverSessionServer
- v$session表的妙用Session
- V$session 表的妙用Session
- 物料主資料中MRP相關欄位理解
- v$session的blocking_session含義SessionBloC
- session和v$session說明Session
- v session_wait v session_event v system_eventSessionAI
- v$session_event , v$system_event , v$session_waitSessionAI
- 【Mongo】mongo更新欄位為另一欄位的值Go
- drools session理解Session
- [轉] V$session 表的妙用Session
- V$session 表的妙用^_^(轉)Session
- 巧用欄位對映實現指定欄位的搜尋