V$SESSION
今流れているSQLの状態を確認する際、まず参照されるのがV$SESSIONです。無条件で出力するとバックグランドプロセスも出力されるのでTYPE=’USER’と条件を入れて参照します。(バックグランドプロセスを分析する際は当然ですがこの限りでありません)当然単体で見る事も多いですが、その他の動的パフォーマンスビューと結合して分析するシーンも多くあります。
select
w.INST_ID
,w.USERNAME
,w.STATUS
,count(*) count_session
,min(w.LOGON_TIME) min_logon_time
,max(w.LOGON_TIME) max_logon_time
,round(sum(w.PGA_ALLOC_MEM)/1024/1024) PGA_SIZE_MBYTE
,max(w.PGA_MAX_MEM) PGA_MAX_MEM
from
(
select t.INST_ID,LAST_CALL_ET,t.STATUS
,t.USERNAME,t.LOGON_TIME
,b.PGA_ALLOC_MEM --現在割り当てられているPGAメモリ
,b.PGA_MAX_MEM -- 割り当て最大
from gv$session t
left outer join gv$process b
on t.PADDR = b.ADDR and t.INST_ID = b.INST_ID
where 1=1
and t.TYPE='USER'
) w
group by w.INST_ID,w.USERNAME,w.STATUS
order by w.INST_ID,w.USERNAME,w.STATUS
;
| 項目名 | 解説 |
|---|---|
| SADDR | セッションアドレス。V$TEMPSEG_USAGEのSESSION_ADDRと結合すると一時セグメントを利用したか否か、また利用した理由も調べる事できます |
| SID | セッション識別子。ある断面においてはこの項目だけでユニークになるけれど、使いまわしされるのでSERIAL#まで入れてセッションを特定します。(おそらくですが、インスタンスの再起動がされるとSID+SERIAL#であっても重複の可能性出てくるのでは?) |
| SERIAL# | |
| STATUS | セッションの状態。ACTIVE/INACTIVE/KILLED/CACHED/SNIPED |
| LAST_CALL_ET | STATUSの状態が切り替わってからの経過時間 |
| EVENT | セッションが待機しているリソースおよびイベント。 |
| BLOCKING_SESSION_STATUS | ='VALID'の条件で絞るとロックが原因で待ちとなっているセッションを特定できます。 |
| LOGON_TIME | ログイン時刻 |
| LAST_CALL_ET | セッションの状態(ACTIVE/INACTIVE)が変化してからの経過時間(秒) |

