データベースの稼働状況を診断共有するサイト パフォーマンスセラピー
Statspackとは Statspack設定 statspackでの情報収集 statspackレポートの出力 便利スクリプト Oracleチューニング講座


                                  
第6章 システム統計情報とセッション統計情報
本章ではパフォーマンス診断にとって有効な情報となる統計情報について説明します。システム統計情報を定期的に取得し確認することでOracleデータベースの「動き」を把握することができますので活用していきましょう。
システム統計情報は、システム全体を表すV$SYSSTATビュー、セッション情報であるV$SESSTATビュー及びV$SYS_TIME_MODELビューが存在します。目的にあわせて必要な情報を収集してください。
また、各システム統計情報は累積値が記されていますので、特定期間の情報を得るためには、2点間の差分値を計算する必要があります。

V$SYSSTATビュー
V$SYSSTATビューには、インスタンスが起動してから現在までに発生したシステム統計の合計値が示されます。
以下に例を示します。

例)ユーザーがコミットした回数
  ディスクから読込まれたブロック数
  生成されたREDOの合計サイズ    など

システム統計を示します。
<主な列>
・STATISTIC#
・NAME
・VALUE
:統計番号 STATISTIC# 統計番号
:統計名
:統計値

V$SYSSTATビューを使用して統計情報を確認してみましょう。
例)「parse」という文字列を含む統計情報を調べる。
SQL> SELECT name,value
2 FROM v$sysstat
3 WHERE name LIKE '%parse%';

NAME VALUE
--------------------  --------------
parse time cpu 1944
parse time elapsed 5517
parse count (total) 57742
parse count (hard) 2220
parse count (failures) 30

上記の例では、「parse」すなわち、「SQLの解析」に関係する統計情報を確認しています。解析に費やしたCPU時間(parse time cpu)や経過時間(parse time elapsed)の状況や、SQL解析の合計数(parse count (total))、SQLのハード解析の数(parse count (hard))を確認することができます。

NOTE 統計の値だけをみて値が大きい、少ないを判断することはできません。これらの情報は定期的に記録し、変化を比較することに役立ちます。

◆代表的な統計一覧
以下にV$SYSSTATビューのNAME列で表示される代表的な統計情報の一覧を記します。
統計名 説明
consistent gets ブロックの読取り一貫性が要求された回数
CPU used by this session ユーザー・セッションが使用したCPU時間(1/100秒)
db block gets CURRENTブロックが要求された回数
DB time データベース・ユーザー・レベルのコールの実行に要した経過時間
DBWR checkpoints チェックポイントの回数
DBWR make free requests DBWRが空きバッファを作成するように要求された回数
execute count SQL実行コールの合計数
free buffer inspected 再利用バッファを検索するためにLRUリストの終わりからスキップされたバッファ数
logons cumulative ログオンの合計数
logons current 現在ログインしている合計数
opened cursors cumulative オープンされたカーソルの合計数
opened cursors current 現在オープンされているカーソルの合計数
parse (hard) ハード解析された回数
parse (total) 解析の合計数
parse time elapsed 解析の合計経過時間(1/100秒)
physical reads ディスクから読込んだ合計ブロック数
physical reads direct バッファ・キャッシュをバイパスしてディスクから直接読込んだ合計ブロック数
physical writes ディスクに書込まれた合計ブロック数
recursive calls 再帰SQLの合計数
redo buffer allocation retries REDOログ・バッファへの書込みを待機した回数
redo entries REDOエントリの数
redo log space requests ログ・スイッチを待機した回数
redo log space wait time redo log space requestsを待機した時間(1/100秒)
redo size 生成されたREDOの合計サイズ
redo write time REDOログ・バッファのREDOをログ・ファイルに書出すのに要した合計時間(1/100秒)
session cursor cache hits セッション・カーソル・キャッシュを使用した回数
session logical reads 読込んだ合計ブロック数(consistent gets + db block gets)
session pga memory セッションのPGAサイズ
session pga memory max セッションが最大で使用したPGAサイズ
session uga memory セッションのUGAサイズ
session uga memory max セッションが最大で使用したUGAサイズ
sorts (disk) ディスク・ソート回数
sorts (memory) メモリー・ソート回数
sorts (rows) ソートされた行の合計数
table fetch by rowid ROWIDによって(通常は索引アクセス)アクセスされた行の合計数
table fetch continued row フェッチ作業中に検出された連鎖行・移行行の数
table scan blocks gotten スキャンされたブロック数
table scan rows gotten スキャンされた行数
table scans (long tables) 全表スキャンでlongテーブルがアクセスされた回数
table scans (short tables) 全表スキャンでshortテーブルがアクセスされた回数
user commits ユーザーによって発行されたコミット数
user rollbacks ユーザーによって発行されたロールバック数
workarea executions - multipass SQL作業領域がmultipassモードで使用された回数
workarea executions - onepass SQL作業領域がonepassモードで使用された回数
workarea executions - optimal SQL作業領域がoptimalモードで使用された回数

V$SESSTATビュー
V$SESSTATビューには、ユーザー・セッションが開始してから現在までの各セッションごとの統計が示されます。V$SESSTATビューには統計名がないため、通常V$STATNAMEビューと結合して使用します。
特定セッションの処理が、Oracleに対してどのような影響を及ぼしているかなどを調査する場合に役立ちます。

以下にユーザー・セッション統計名を示します。
<主な例>
・SID
・STATISTIC#
・VALUE
:セッション識別子
:統計番号。この番号はリリースが変わると変更される可能性がある。
:統計値

◆V$STATNAMEビュー
以下に統計情報の統計名を示します。通常、V$SESSTATビューと結合して使用します。
<主な例>
・STATISTIC#
・NAMA
:統計番号。この番号はリリースが変わると変更される可能性がある。
:統計名

V$SESSTATビューとV$STATNAMEビューを結合させてユーザ・セッションの統計情報を確認してみましょう。
例)SCOTTユーザー・セッションで生成されたREDOサイズを調べる。
SQL> SELECT se.sid,username,name,value
2 FROM v$sesstat st,v$statname sn,v$session se
3 WHERE st.statistic# = sn.statistic#
4 AND st.sid = se.sid
5 AND username = 'SCOTT'
6 AND name = 'redo size';

SID USERNAM NAME VALUE
----- ---------- ---------- ----------
252 SCOTT redo size 10316036


V$SYS_TIME_MODELビュー
システム全体を調査するためには、様々な統計情報を「時間」という共通の比較尺度が必要となります。
そのため、V$SYS_TIME_MODELビューは、様々な操作に対してセッション全体に蓄積された時間を示します。

例えばDB timeは、データベース・サーバーでユーザー要求の処理にかかった累積時間です。
これには、アイドル状態でないユーザー・セッションすべての待機時間とCPUタイムが含まれるため、チューニングにより待機時間が減少すれば、特定期間のDB timeを減少させることができます。
また、セッション別統計として、V$SESS_TIME_MODELビューも存在します。

以下に様々な操作に対してセッション全体に蓄積された時間を示します。

<主な例>
・STAT_ID
・STAT_NAME
・VALUE
:時間統計の統計識別子
:統計名
:システムがこの操作に要した時間(1/1000秒単位)

◆統計情報
以下にV$SYS_TIME_MODELビューのSTAT_NAME列で表示される代表的な統計情報の一覧を記します。
・DB time データベース・ユーザー・レベルのコールの実行に要した経過時間。バックグラウンド・プロセスに費やされた時間は含まれていない。
・DB CPU データベース・ユーザー・レベルのコールの実行に要したCPU時間。バックグラウンド・プロセスに費やされた時間は含まれていない。
・sequence load elapsed time データ・ディクショナリから次の順序番号を取得するために要した時間。
・parse time elapsed SQLの解析に費やされた経過時間。ソフト・ハード解析両方を含む。
・hard parse elapsed time SQLのハード解析に費やされた経過時間。
・sql execute elapsed time SQLの実行に要した経過時間。SELECTの場合は、問合せ結果のフェッチを実行するために要した時間も含まれる。
・connection management call elapsed time セッションの接続および切断コールの実行に要した時間。
・failed parse elapsed time 最終的に解析エラーを戻して失敗したSQL解析の実行に要した時間。
・hard parse (sharing criteria) elapsed time SQLキャッシュ内の既存カーソルの共有ができないために発生したSQLハード解析の実行に要した時間。
・hard parse (bind mismatch) elapsed time SQLキャッシュ内の既存カーソルとのバインド・タイプまたはバインド・サイズの不一致のため発生したSQLハード解析の実行に要した時間。
・PL/SQL execution elapsed time PL/SQLの実行に要した時間。SQL文の再帰的実行または解析に費やされた時間やJAVA VMの再帰的実行に費やされた時間は含まれない。
・PL/SQL compilation elapsed time PL/SQLコンパイラの実行に費やされた時間。
・inbound PL/SQL rpc elapsed time インバウンドPL/SQLリモート・プロシージャ・コールの実行に費やされた時間。SQLおよびJAVAの再帰的実行や費やされたすべての時間を含む。従って、この値とPL/SQL execution elapsed timeの値との関連は簡単に判断できない。
・Java execution elapsed time Java VM1の実行に費やされた時間。SQL文の再帰的実行や解析に要した時間またはPL/SQLの再帰的実行に要した時間は含まれない。

V$SYS_TIME_MODELビューを参照してセッション全体に蓄積された時間を確認してみましょう。
例)V$SYS_TIME_MODELビューを参照する。
SQL> SELECT * FROM v$sys_time_model;

STAT_ID STAT_NAME VALUE
------------ ------------------------------------------ ----------
3649082374 DB time 19449341986
2748282437 DB CPU 5934739299
4157170894 background elapsed time 8939642954
2451517896 background cpu time 2064001619
4127043053 sequence load elapsed time 351210316
1431595225 parse time elapsed 15629538588
372226525 hard parse elapsed time 14166623161
2821698184 sql execute elapsed time 16287570138
1990024365 connection management call elapsed time 1983799079
1824284809 failed parse elapsed time 4659188764
4125607023 failed parse (out of shared memory) elapsed time 4571631097
3138706091 hard parse (sharing criteria) elapsed time 310672215
268357648 hard parse (bind mismatch) elapsed time 36671358
2643905994 PL/SQL execution elapsed time 1130933048
290749718 inbound PL/SQL rpc elapsed time 0
1311180441 PL/SQL compilation elapsed time 1091741754
751169994 Java execution elapsed time 0

次章ではディスクI/Oを効率化させる為のストライプ化についてご紹介します。

第7章 ストライプ化とは