- TOP
- BLOG
- 技術ブログ
- la.sql from TPT Scripts : Show which latch occupies a given memory address and its stats
技術ブログ
このエントリは (全部俺) 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を補う必要がなく、便利です。