技術ブログ
技術ブログ
このエントリは (全部俺) 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