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 にして、
増加エクステント数で判断している。検討違いな値ではないと思うが、
少なからず誤差もあるはず。参考まで。