技術ブログ
技術ブログ
このエントリは (全部俺) Oracle ACE Director Tanel Poder Advent Calendar 2013 4日目の記事です。
http://co-sol.jp/techdb/2013/12/advanced-oracle-troubleshooting-guide-part-2-no-magic-is-needed-systematic-approach-will-do-ja.html で使われていたsw.sqlについて説明を記載します。
引数に指定したセッションIDについて、現時点の待機情報を表示します。
与えられた引数は
FROM
v$session_wait
WHERE
sid IN (&1)←★
という形で展開されるため、IN句に指定可能な形式であれば、なんでも指定可能です。
単一のSIDを指定できます。
SQL> @sw 26
SID STATE EVENT SEQ# SEC_IN_WAIT P1 P2 P3 P1TRANSL
------- ------- ---------------------------------------- ---------- ----------- ------------------ ------------------ ------------------ ------------------------------------------
26 WORKING On CPU / runqueue 71 0
カンマ区切りで複数のSIDを指定できます。
SQL> @sw 1,2,3
SID STATE EVENT SEQ# SEC_IN_WAIT P1 P2 P3 P1TRANSL
------- ------- ---------------------------------------- ---------- ----------- ------------------ ------------------ ------------------ ------------------------------------------
2 WAITING VKTM Logical Idle Wait 1 1112796 0 0 0
1 WAITING pmon timer 42836 1 duration= 300 0 0
3 WAITING rdbms ipc message 44312 0 timeout= 300 0 0
ただし、空白を入れるとエラーとなります。クオートすればOKです。
SQL> @sw 1, 2, 3
sid IN (1,)
*
行40でエラーが発生しました。:
ORA-00936: 式がありません。
SQL> @sw "1, 2, 3"
SID STATE EVENT SEQ# SEC_IN_WAIT P1 P2 P3 P1TRANSL
------- ------- ---------------------------------------- ---------- ----------- ------------------ ------------------ ------------------ ------------------------------------------
2 WAITING VKTM Logical Idle Wait 1 1113205 0 0 0
1 WAITING pmon timer 42972 2 duration= 300 0 0
3 WAITING rdbms ipc message 44448 1 timeout= 300 0 0
サブクエリとして評価されるSELECT文を書くこともできます。クオートが必要です。
SQL> @sw "select sid from v$session where username = 'SYS'"
SID STATE EVENT SEQ# SEC_IN_WAIT P1 P2 P3 P1TRANSL
------- ------- ---------------------------------------- ---------- ----------- ------------------ ------------------ ------------------ ------------------------------------------
26 WORKING On CPU / runqueue 79 0
SQL> @sw "select sid from v$session where username IS NULL"
SID STATE EVENT SEQ# SEC_IN_WAIT P1 P2 P3 P1TRANSL
------- ------- ---------------------------------------- ---------- ----------- ------------------ ------------------ ------------------ ------------------------------------------
252 WAITING AQPC idle 37088 12 0 0 0
4 WAITING DIAG idle wait 61080 0 component= 5 where= 1 wait
time(millisec)=
1000
:
13 WAITING rdbms ipc message 25609 170 timeout= 30000 0 0
248 WAITING rdbms ipc message 20944 169 timeout= 30000 0 0
240 WAITING rdbms ipc message 1286 131 timeout= 180000 0 0
8 WAITING smon timer 48783 3 sleep time= 300 failed= 0 0
41行が選択されました。
i.sqlを実行済みの場合、mysidというSQL*Plus変数が自セッションのSIDとして定義済みであるため、これを使用できます。
SQL> define mysid
DEFINE MYSID = "26" (CHAR)
SQL> @sw &mysid
SID STATE EVENT SEQ# SEC_IN_WAIT P1 P2 P3 P1TRANSL
------- ------- ---------------------------------------- ---------- ----------- ------------------ ------------------ ------------------ ------------------------------------------
26 WORKING On CPU / runqueue 28 0
SQL>
sw.sqlの結果として以下の列が返されます。情報がコンパクトにまとまっているので、使いやすいです。
sw_sid sid
state state
sw_event event
seq# seq#
sec_in_wait seconds_in_wait
SW_P1 パラメータの説明(p1text)とp1
SW_P2 パラメータの説明(p2text)とp2
SW_P3 パラメータの説明(p3text)とp3
sw_p1transl 待機イベントの種類('cursor:%', 'enq%', 'latch%', 'library cache pin')
に合わせて整形したp1