- TOP
- BLOG
- 技術ブログ
- la.sql from TPT Scripts : Show which latch occupies a given memory address and its stats
コーソルDatabaseエンジニアのブログ
技術ブログ
技術ブログ
このエントリは (全部俺) Oracle ACE Director Tanel Poder Advent Calendar 2013 10日目の記事です。
http://co-sol.jp/techdb/2013/12/advanced-oracle-troubleshooting-guide-part-2-no-magic-is-needed-systematic-approach-will-do-ja.html で使われていたla.sqlについて書きます。
la.sqlは指定してされたラッチのアドレスについて、ラッチの統計情報を出力します。 以下のように非常に単純なSQLです。親ラッチに対応するv$latch_parentと、子ラッチに対応するv$latch_childrenのいずれからも情報を取得できるようになっているため(*1)、指定するアドレスとして、親ラッチと子ラッチに対応しています。
-------------------------------------------------------------------------------- -- -- File name: la.sql ( Latch Address ) -- Purpose: Show which latch occupies a given memory address and its stats -- -- Author: Tanel Poder -- Copyright: (c) http://www.tanelpoder.com -- -- Usage: @la <address_in_hex> -- @la 50BE2178 -- -------------------------------------------------------------------------------- column la_name heading NAME format a40 column la_chld heading CHLD format 99999 select addr, latch#, 0 la_chld, name la_name, gets, immediate_gets igets, misses, immediate_misses imisses, spin_gets spingets, sleeps, wait_time from v$latch_parent ←(*1) where addr = hextoraw(lpad('&1', (select vsize(addr)*2 from v$latch_parent where rownum = 1) ,0)) ←(*2) union all select addr, latch#, child#, name la_name, gets, immediate_gets igets, misses, immediate_misses imisses, spin_gets spingets, sleeps, wait_time from v$latch_children ←(*1) where addr = hextoraw(lpad('&1', (select vsize(addr)*2 from v$latch_children where rownum = 1) ,0)) ←(*2) /
細かいテクニックですが、
where addr = hextoraw(lpad('&1', (select vsize(addr)*2 from v$latch_children where rownum = 1) ,0)) ←(*2)
が泣かせる感じです。V$ビューにおけるラッチのアドレスはプラットフォームにより64bit幅(16進表記で16文字)の場合と 32bit幅(16進表記で8文字)の場合があります。その一方で、診断ソースによっては、64bitプラットフォームであっても上位の0が省略され、32bit幅(16進表記で8文字)で出力される場合があります。(*2)のように、vsizeでサイズを取得し、lpadで上位を0埋めしてくれると、いちいち上位の0を補う必要がなく、便利です。