今週の名言
「自分が多数派の側にいると気付いたら、もう意見を変えてもいい頃だ。」
マーク・トウェイン
最近、マーク・トウェインの名言が多いですが、偶然です。
DBバッファの統計を調査する。
前回は、stats$snapshot表からスナップショット一覧を取得するSQL文を紹介しました。
今回から、応用編としてこの表とパフォーマンス・データが格納された表を結合して、1日の統計情報の推移を見てみます。
最初は取っ付き易いDBバッファについて調べてみましょう。
DBバッファヒット率の計算式
DBバッファの目的は、頻繁にアクセスされるDBブロックをなるべくメモリ(DBバッファ)に保持しておくことで、低速なディスクI/Oを回避することです。DBバッファ・ヒット率とは、要求されたDBブロックがバッファ内に存在していた割合を示すもので、以下の計算式によります。
DBバッファヒット率
=((CONSISTENT_GETS + DB_BLOCK_GETS)-(PHYSICAL_READS))➗(CONSISTENT_GETS + DB_BLOCK_GETS)✖️100
データ取得SQL文
DBバッファヒット率を取得する方法はいくつかありますが、ここではSTATS$BUFFER_POOL_STATISTICS表を使用する方法を紹介します。
この表はV$BUFFER_POOL_STATISTICSのスナップショットを保持しているものです。
また、DBバッファヒット率だけではなくBuffer Busy Wait統計情報も一緒に取得します。
今回のSTATSPACK環境は前回とは違って1時間ごとにスナップショットを取得している環境です。
select os.INSTANCE_NUMBER ,to_char(trunc(os.SNAP_TIME,'mi'),'yyyy/mm/dd hh24:mi') sdate --,os.SNAP_ID SNAP_ID1 --,ns.SNAP_ID SNAP_ID2 ,nb.NAME buffer_pool_name ,decode(( (nb.CONSISTENT_GETS - ob.CONSISTENT_GETS) +(nb.DB_BLOCK_GETS - nb.DB_BLOCK_GETS)),0,0, -- 0除算回避 (trunc((((nb.CONSISTENT_GETS - ob.CONSISTENT_GETS) +(nb.DB_BLOCK_GETS - nb.DB_BLOCK_GETS) ) -(nb.PHYSICAL_READS - ob.PHYSICAL_READS) ) /((nb.CONSISTENT_GETS - ob.CONSISTENT_GETS) +(nb.DB_BLOCK_GETS - nb.DB_BLOCK_GETS) )*100,1 ) ) ) bhr ,nb.BUFFER_BUSY_WAIT - ob.BUFFER_BUSY_WAIT bbw from STATS$SNAPSHOT os ,STATS$SNAPSHOT ns ,STATS$BUFFER_POOL_STATISTICS ob ,STATS$BUFFER_POOL_STATISTICS nb where 1=1 and trunc(os.SNAP_TIME,'mi') between to_date('xxxx/xx/xx 00','yyyy/mm/dd hh24') and to_date('xxxx/xx/xx 23','yyyy/mm/dd hh24') and trunc(ns.SNAP_TIME,'mi') = trunc(os.SNAP_TIME,'mi') + 1/24 and os.SNAP_ID = ob.SNAP_ID and os.DBID = ob.DBID and os.INSTANCE_NUMBER = ob.INSTANCE_NUMBER and ns.SNAP_ID = nb.SNAP_ID and ns.DBID = nb.DBID and os.INSTANCE_NUMBER = ns.INSTANCE_NUMBER and os.INSTANCE_NUMBER = nb.INSTANCE_NUMBER and os.INSTANCE_NUMBER = 1 order by os.instance_number ,to_char(os.SNAP_TIME,'yyyy/mm/dd hh24mi');
実行例
実行例は以下のようになります。
SQL> set pages 50 SQL> col BHR for 990.0 SQL> select 2 os.INSTANCE_NUMBER 3 ,to_char(trunc(os.SNAP_TIME,'mi'),'yyyy/mm/dd hh24:mi') sdate 4 --,os.SNAP_ID SNAP_ID1 5 --,ns.SNAP_ID SNAP_ID2 6 ,nb.NAME buffer_pool_name 7 ,decode(( (nb.CONSISTENT_GETS - ob.CONSISTENT_GETS) 8 +(nb.DB_BLOCK_GETS - nb.DB_BLOCK_GETS)),0,0, -- 0除算回避 9 (trunc((((nb.CONSISTENT_GETS - ob.CONSISTENT_GETS) 10 +(nb.DB_BLOCK_GETS - nb.DB_BLOCK_GETS) 11 ) 12 -(nb.PHYSICAL_READS - ob.PHYSICAL_READS) 13 ) 14 /((nb.CONSISTENT_GETS - ob.CONSISTENT_GETS) 15 +(nb.DB_BLOCK_GETS - nb.DB_BLOCK_GETS) 16 )*100,1 17 ) 18 ) 19 ) bhr 20 ,nb.BUFFER_BUSY_WAIT - ob.BUFFER_BUSY_WAIT bbw 21 from 22 STATS$SNAPSHOT os 23 ,STATS$SNAPSHOT ns 24 ,STATS$BUFFER_POOL_STATISTICS ob 25 ,STATS$BUFFER_POOL_STATISTICS nb 26 where 1=1 27 and trunc(os.SNAP_TIME,'mi') between to_date('2015/07/28 00','yyyy/mm/dd hh24') 28 and to_date('2015/07/28 23','yyyy/mm/dd hh24') 29 and trunc(ns.SNAP_TIME,'mi') = trunc(os.SNAP_TIME,'mi') + 1/24 30 and os.SNAP_ID = ob.SNAP_ID 31 and os.DBID = ob.DBID 32 and os.INSTANCE_NUMBER = ob.INSTANCE_NUMBER 33 and ns.SNAP_ID = nb.SNAP_ID 34 and ns.DBID = nb.DBID 35 and os.INSTANCE_NUMBER = ns.INSTANCE_NUMBER 36 and os.INSTANCE_NUMBER = nb.INSTANCE_NUMBER 37 and os.INSTANCE_NUMBER = 1 38 order by 39 os.instance_number 40 ,to_char(os.SNAP_TIME,'yyyy/mm/dd hh24mi'); INSTANCE_NUMBER SDATE BUFFER_POOL_NAME BHR BBW --------------- ---------------- -------------------- ------ ---------- 1 2015/07/28 00:00 DEFAULT 100.0 0 1 2015/07/28 01:00 DEFAULT 100.0 1 1 2015/07/28 02:00 DEFAULT 100.0 0 1 2015/07/28 03:00 DEFAULT 100.0 0 1 2015/07/28 04:00 DEFAULT 100.0 0 1 2015/07/28 05:00 DEFAULT 100.0 0 1 2015/07/28 06:00 DEFAULT 100.0 1 1 2015/07/28 07:00 DEFAULT 100.0 0 1 2015/07/28 08:00 DEFAULT 100.0 0 1 2015/07/28 09:00 DEFAULT 100.0 0 1 2015/07/28 10:00 DEFAULT 100.0 0 1 2015/07/28 11:00 DEFAULT 100.0 0 1 2015/07/28 12:00 DEFAULT 100.0 0 1 2015/07/28 13:00 DEFAULT 100.0 0 1 2015/07/28 14:00 DEFAULT 100.0 1 1 2015/07/28 15:00 DEFAULT 100.0 0 1 2015/07/28 16:00 DEFAULT 100.0 2 1 2015/07/28 17:00 DEFAULT 99.9 5 1 2015/07/28 18:00 DEFAULT 100.0 0 1 2015/07/28 19:00 DEFAULT 100.0 0 1 2015/07/28 20:00 DEFAULT 100.0 0 1 2015/07/28 21:00 DEFAULT 100.0 0 1 2015/07/28 22:00 DEFAULT 100.0 0 1 2015/07/28 23:00 DEFAULT 100.0 0 24行が選択されました。
この環境はアクティビティがほとんどないので、DBバッファヒット率はほぼ100%ですが、お手元のSTATSPACKではどのような結果が得られるでしょうか?
この結果を、MS Excelのシートにコピー&ペーストしてグラフにしていくのですが、その要領は次回で紹介します。
テーブルの結合列について
STATS$SNAPSHOT表の主キーを構成する列を確認すると「SNAP_ID,DBID,INSTANCE_NUMBER」の3つの列から成っていることがわかります。
SQL> select TABLE_NAME,CONSTRAINT_NAME,COLUMN_NAME,POSITION 2 from USER_CONS_COLUMNS 3 where CONSTRAINT_NAME = 'STATS$SNAPSHOT_PK' 4 order by POSITION; TABLE_NAME CONSTRAINT_NAME COLUMN_NAME POSITION --------------- ------------------ --------------- ---------- STATS$SNAPSHOT STATS$SNAPSHOT_PK SNAP_ID 1 STATS$SNAPSHOT STATS$SNAPSHOT_PK DBID 2 STATS$SNAPSHOT STATS$SNAPSHOT_PK INSTANCE_NUMBER 3
一方、結合表であるSTATS$BUFFER_POOL_STATISTICS表の外部キーを確認すると、同様に「SNAP_ID,DBID,INSTANCE_NUMBER」となっていることがわかります。
SQL> select TABLE_NAME,CONSTRAINT_NAME,COLUMN_NAME,POSITION 2 from USER_CONS_COLUMNS 3 where CONSTRAINT_NAME = 'STATS$BUFFER_POOL_STATS_FK' 4 order by POSITION; TABLE_NAME CONSTRAINT_NAME COLUMN_NAME POSITION ----------------------------- ---------------------------- --------------- ---------- STATS$BUFFER_POOL_STATISTICS STATS$BUFFER_POOL_STATS_FK SNAP_ID 1 STATS$BUFFER_POOL_STATISTICS STATS$BUFFER_POOL_STATS_FK DBID 2 STATS$BUFFER_POOL_STATISTICS STATS$BUFFER_POOL_STATS_FK INSTANCE_NUMBER 3
STATSPACKデータのグラフ化は、基本的にSTATS$SNAPSHOT表と関連する表を結合してデータを取得しますが、結合列はこれら3つの列を必ず指定するようにしましょう。
続く