Oracleスナップショットの定義

Statspack では、スナップショットレベルが以下のように定義されている。



スナップショットレベルの内容

・レベル0 全体的なパフォーマンス統計
・レベル5 下位の内容 + SQL ステートメント (※デフォルト)
・レベル6 下位の内容 + SQL 実行計画および SQL 実行計画の使用率
・レベル7 下位の内容 + セグメントレベルの統計
・レベル10 下位の内容 + 親ラッチおよび子ラッチ

デフォルトは 5 であるため、例えば実行計画の情報が必要な場合は、
スナップショットレベルを 6 で取得する。なお、上位レベルで取得
する時は負荷が高くなるので、安易に 10 などとしないこと。

取得されるデータ量が異なるということは、レベルが上がるにつれて
スナップショットサイズも増えるのだが、どの程度差異があるか?

SQLを実行して検証

データディクショナリの dba_data_files テーブルと dba_free_space テーブルからサイズを取り検証。

SQL>
select
  tablespace_name,
  to_char(nvl(total_bytes / 1024,0),'999,999,999') as "size(KB)",
  to_char(nvl((total_bytes - free_total_bytes) / 1024,0),'999,999,999') as "used(KB)",
  to_char(nvl(free_total_bytes/1024,0),'999,999,999') as "free(KB)",
  round(nvl((total_bytes - free_total_bytes) / total_bytes * 100,100),2) as "rate(%)"
from
  ( select
      tablespace_name,
      sum(bytes) total_bytes
    from
      dba_data_files
    group by
      tablespace_name
  ),
  ( select
      tablespace_name free_tablespace_name,
      sum(bytes) free_total_bytes
    from
      dba_free_space
    group by tablespace_name
  )
where
  tablespace_name = free_tablespace_name(+)
and
  tablespace_name = 'hoge'
/

tablespace_name size(KB)  used(KB)  free(KB)  rate(%)
--------------- --------- --------- --------- -------
hoge              512,000   334,208  177,792    65.28

used(KB) の値を事前にチェックして、スナップショットを取得するたびに
使用サイズの変化を確認。レベルが高ければ数回でサイズが増えたが、
例えばレベル0などでは、25回ほど実施してようやくサイズ増加がみられた。

どの程度サイズが増えたか

増加したサイズを実行回数で割ると、おおよそのサイズを算出できた。
【結果】スナップショット1回あたりに使用するサイズの概算(レベル毎)
レベル0:50 KB、レベル5:150 KB、レベル10:600 KB

なお、初回実行時は内部で STATS$ から始まるテーブルが生成されるため
例外として考える。(初回は、150~200KB程度使用されている。)

この表領域は、initial_extent や next_extent による増分を 1MB にして、
増加エクステント数で判断している。検討違いな値ではないと思うが、
少なからず誤差もあるはず。参考まで。