チューニング用情報取得

--------------
-- perform.sql
--------------
set lines 1000
set heading OFF
col AAA                for a23
col DB_BLOCK_BUFFERS   for a23
col BUFFER_CACHE_FREE  for a23
col LIBLARY_CACHE_HIT  for a23
col DICTIONALY_CACHE   for a23
col REQUEST_MISSES     for a23
col REQUEST_FAILURES   for a23
col FREE_BUFFER_INSPECTED for a23
col BUFFER_BUSY_WAITS  for a23
col REDO_SPACE_WAIT    for a23
col ALLOCATION_RETRY   for a23
col MEMORY_SORT_SIZE   for a23
col TABLE_FULL_SCAN    for a23
pro+----------------------+-------------+----------+;
-- バッファキャッシュのヒット率(1)
        SELECT  'DB_BLOCK_BUFFERS ' as AAA
              , '|'||lpad(to_char((A.RATIO * 100),'990.99'),12,' ')||
                '|'||lpad(DECODE(SIGN(A.RATIO - 0.9),1,'OK', '(NG)'), 6, ' ') as DB_BLOCK_BUFFERS
              , '|'||'  OK:90%以上  NG:DB_CACHE_SIZE,DB_KEEP_CACHE_SIZE,DB_RECYCLE_CACHE_SIZEを増'
         FROM   (SELECT 1 - P.VALUE / (L1.VALUE + L2.VALUE) as RATIO
                   FROM V$SYSSTAT P
                       ,V$SYSSTAT L1
                       ,V$SYSSTAT L2
                  WHERE P.NAME  = 'physical reads'
                    AND L1.NAME = 'db block gets'
                    AND L2.NAME = 'consistent gets'
                ) A
;
-- キャッシュのヒット率の測定(2)
--      select  'CACHE_HIT_RATIO'  as AAA
--            , 1-(phy.value - lob.value - dir.value) / ses.value as "CACHE HIT RATIO"
--      FROM  v$sysstat ses , v$sysstat lob,
--            v$sysstat dir , v$sysstat phy
--      WHERE ses.name  = 'session logical reads'
--      AND   dir.name  = 'physical reads direct'
--      AND   lob.name  = 'physical reads direct (lob)'
--      AND   phy.name  = 'physical reads'
--;
-- バッファキャッシュの最適化
        SELECT  'BUFFER_CACHE_FREE '  as AAA
              , '|'||lpad(to_char(ROUND(A.RATIO, 3) * 100,'990.99'),12,' ')||
                '|'||lpad(DECODE(SIGN(ROUND(A.RATIO, 3) * 100),1,'OK', '(NG)'), 6,' ') as BUFFER_CACHE_FREE
              , '|'||'  OK:バッファキャッシュ余裕あり NG:バッファキャッシュ余裕なし'
          FROM (SELECT B.FREE / C.TOTAL RATIO
                  FROM (SELECT COUNT(*) as FREE
                          FROM X$BH
                         WHERE STATE = 0
                       ) B
                      ,
                       (SELECT COUNT(*) as TOTAL
                          FROM X$BH
                       ) C
               ) A
;
-- ライブラリキャッシュのヒット率
        SELECT  'LIBLARY_CACHE_HIT'  as AAA
              , '|'||lpad(to_char((A.RATIO * 100),'990.99'),12,' ')||
                '|'||lpad(DECODE(SIGN(A.RATIO - 0.99),1,'OK', '(NG)'), 6, ' ') as LIBLARY_CACHE_HIT
              , '|'||'  OK:99%以上 NG:SHARED_POOL_SIZEの値を大きくする'
          FROM (SELECT SUM(PINS - RELOADS) /SUM(PINS) RATIO
               FROM V$LIBRARYCACHE) A
;
-- ディクショナリキャッシュのヒット率
        SELECT  'DICTIONALY_CACHE ' as AAA
              , '|'||lpad(to_char((A.RATIO * 100),'990.99'),12,' ')||
                '|'||lpad(DECODE(SIGN(A.RATIO - 0.95),1,'OK','(NG)'), 6, ' ') as DICTIONALY_CACHE
              , '|'||'  OK:95%以上  NG:SHARED_POOL_SIZEの値を大きくする'
          FROM (SELECT SUM(GETS - GETMISSES) /SUM(GETS) RATIO
               FROM V$ROWCACHE) A
;
-- LRUリストからオブジェクトのフラッシュが開始された回数
        SELECT  'REQUEST__MISSES   '  as AAA
              , '|'||lpad(to_char(REQUEST_MISSES, '9,999,990'),12,' ')||
                '|'||lpad(DECODE(REQUEST_MISSES,0,'OK','(NG)'), 6, ' ')  as REQUEST_MISSES
              , '|'||'  0が望ましい'
          FROM V$SHARED_POOL_RESERVED
;
-- 要求を満たすためのメモリーが見つからなかった回数
        SELECT  'REQUEST_FAILURES '   as AAA
              , '|'||lpad(to_char(REQUEST_FAILURES, '9,999,990'),12,' ')||
                '|'||'    --  '   as REQUEST_FAILURES
              , '|'||'  要求を満たすためのメモリーが見つからなかった回数'
          FROM V$SHARED_POOL_RESERVED
;
-- 待機統計情報の確認
        SELECT  'FREE_BUFFER_INSPECTED  ' as AAA
              , '|'||lpad(to_char(value, '9,999,990'),12,' ')||
                '|'||'    -- '   as  FREE_BUFFER_INSPECTED
              , '|'||'  inspectedの値が高い場合はバッファキャッシュのサイズを増やす'
          FROM  v$sysstat
         WHERE  name = 'free buffer inspected'
;
-- 待機イベントのチェック
        SELECT  'BUFFER_BUSY_WAITS' as AAA
              , '|'||lpad(to_char(total_waits, '99999990'), 12, ' ')||
                '|'||'    --'   as  BUFFER_BUSY_WAITS
              , '|'||'  バッファ・キャッシュが使用可能になるまでの待機'
          FROM  v$system_event
         WHERE  event IN ('buffer busy waits')
--       WHERE  event IN ('free buffer waits','buffer busy waits')
;
-- REDOログバッファの待機割合
        SELECT  'REDO_SPACE_WAIT  ' as AAA
              , '|'||lpad(to_char((A.RATIO * 100),'990.99'),12,' ')||
                '|'||lpad(DECODE(SIGN(A.RATIO - 0.01),1,'(NG)','OK'), 6, ' ') as REDO_SPACE_WAIT
              , '|'||'  OK:1%未満   NG:LOG_BUFFERの値を大きくする'
         FROM (SELECT R.VALUE / W.VALUE RATIO
                 FROM  V$SYSSTAT R
                     , V$SYSSTAT W
                WHERE R.NAME = 'redo log space requests'
                  AND W.NAME = 'redo writes') A
;
-- redo buffer allocation retries を0に近づけるのが目標
        SELECT  'ALLOCATION_RETRY' as AAA
              , '|'||lpad(to_char(value, '999990'),12,' ')||
                '|'||lpad('   --', 6, ' ') as ALLOCATION_RETRY
              , '|'||'  0に近づけるのが目標(REDOログ・バッファ無いの領域の待機があるかどうか)'
          from v$sysstat
         where name='redo buffer allocation retries'
;
-- メモリソート割合
        SELECT  'MEMORY_SORT_SIZE ' as AAA
              , '|'||lpad(to_char((A.RATIO * 100),'990.99'),12,' ')||
                '|'||lpad(DECODE(SIGN(A.RATIO - 0.95),1,'OK','(NG)'), 6, ' ') as MEMORY_SORT_SIZE
              , '|'||'  OK:95%以上  NG:SORT_AREA_SIZEの値を大きくする'
       FROM (SELECT M.VALUE / (M.VALUE + D.VALUE) RATIO
               FROM V$SYSSTAT M, V$SYSSTAT D
              WHERE M.NAME = 'sorts (memory)'
                AND D.NAME = 'sorts (disk)') A
;
-- 全走査
        SELECT  'TABLE_FULL_SCAN  ' as AAA
              , '|'||lpad(to_char((A.RATIO * 100),'990.99'),12,' ')||
                '|'||lpad(DECODE(SIGN(A.RATIO - 0.1),1,'(NG)','OK'), 6, ' ') as TABLE_FULL_SCAN
              , '|'||'  OK:10%未満  NG:インデックスを見直す'
          FROM (SELECT L.VALUE / (L.VALUE + S.VALUE) RATIO
                  FROM V$SYSSTAT L, V$SYSSTAT S
                 WHERE L.NAME = 'table scans (long tables)'
                   AND S.NAME = 'table scans (short tables)') A
;
pro+----------------------+-------------+----------+;

-- 実行計画が共有されているかどうかの確認
        SELECT  namespace as AAA
              , lpad(to_char((gethitratio * 100), '990.99'),12, ' ')
          FROM  v$librarycache
;
-- 大きな無名PL/SQLブロック
        SELECT ADDRESS, HASH_VALUE, substr(sql_text,1,128)
          FROM V$SQLAREA
         WHERE COMMAND_TYPE = 47
;


<実行結果> +----------------------+-------------+----------+ DB_BLOCK_BUFFERS | 99.92| OK | OK:90%以上 NG:DB_CACHE_SIZE,DB_KEEP_CACHE_SIZE,DB_RECYCLE_CACHE_SIZEを増 BUFFER_CACHE_FREE | 28.30| OK | OK:バッファキャッシュ余裕あり NG:バッファキャッシュ余裕なし LIBLARY_CACHE_HIT | 99.92| OK | OK:99%以上 NG:SHARED_POOL_SIZEの値を大きくする DICTIONALY_CACHE | 99.83| OK | OK:95%以上 NG:SHARED_POOL_SIZEの値を大きくする REQUEST__MISSES | 0| OK | 0が望ましい REQUEST_FAILURES | 0| -- | 要求を満たすためのメモリーが見つからなかった回数 FREE_BUFFER_INSPECTED | 0| -- | inspectedの値が高い場合はバッファキャッシュのサイズを増やす BUFFER_BUSY_WAITS | 42| -- | バッファ・キャッシュが使用可能になるまでの待機 REDO_SPACE_WAIT | 0.10| OK | OK:1%未満 NG:LOG_BUFFERの値を大きくする ALLOCATION_RETRY | 8| -- | 0に近づけるのが目標(REDOログ・バッファ無いの領域の待機があるかどうか) MEMORY_SORT_SIZE | 99.90| OK | OK:95%以上 NG:SORT_AREA_SIZEの値を大きくする TABLE_FULL_SCAN | 10.16| (NG) | OK:10%未満 NG:インデックスを見直す +----------------------+-------------+----------+  * REQUEST_FAILURESの値が1よりも大きく増加している場合、SHARED_POOL_RESERVED_SIZEの値を増やす。