はじめに
本記事をご覧くださりありがとうございます。
今回は、STATSPACKのレポートを取得する方法について解説していきます。
STATSPACKとは
STATSPACKとは、Oracleデータベースの性能問題を調査・分析する為のツールです。
通常レポートと詳細レポートが存在しており、それぞれ下記の特徴があります。
・通常レポート
spreport.sqlを使用して取得する。
主な目的は、システム全体のパフォーマンス把握。
インスタンス統計、待機イベント、Top SQLなどの情報が得られる。
・詳細レポート
sprepsql.sqlを使用して取得する。
主な目的は、特定SQLの詳細分析。
SQLテキスト、実行統計、実行計画、リソース使用状況などの情報が得られる。
性能問題を調査する場合、どのSQLが原因なのか確認するために、詳細レポートの取得を行うことが有効です。
しかし詳細レポートを取得するためには、SQLの識別子である「OLD_HASH_VALUE」の情報が必要になります。
この情報は通常レポートで確認することができるため、まずは通常レポートの採取を行います。
通常レポートを取得する
通常レポートを取得するには、対象のサーバに接続し、「spreport.sql」を実行します。
実行すると、下記に沿ってコマンドが進んでいきます。
①取得したスナップショットの一覧が表示される
②「begin_snapに値を入力してください:」と表示される
③「end_snapに値を入力してください:」と表示される
④「report_nameに値を入力してください」と表示される
②と③で、「いつからいつまでの通常レポートを取得するのか」を決定するため、
まず①で表示された一覧の中で、「Snap Started」と「Snap Id」の記載を確認します。
「Snap Started」の列にはスナップショットの日時が記載されており、
同じ行の「Snap Id」にはスナップショットのIDが記載されています。
今回は例として、2025/10/5の12:00~13:00の調査を行いたい場合を説明します。
「spreport.sql」を実行して、一覧の一部が下記だったとします。
| Snap Id | Snap Started |
|---|---|
| 10000 | 2025/10/5 11:30 |
| 10001 | 2025/10/5 11:45 |
| 10002 | 2025/10/5 12:00 |
| 10003 | 2025/10/5 12:15 |
| 10004 | 2025/10/5 12:30 |
| 10005 | 2025/10/5 12:45 |
| 10006 | 2025/10/5 13:00 |
| 10006 | 2025/10/5 13:15 |
この場合、12:00のSnapIdは10002となるため、
②「begin_snapに値を入力してください:」には10002を入力します。
13:00のSnapIdは10006となるため、
③「end_snapに値を入力してください:」には10003を入力します。
※②と③の値はこの後詳細レポートを取得する際にも使用するため、メモなどに控えておきましょう。
④では通常レポートの名前を入力します。
具体的に決まりはありませんが、日時を名前に含めておくと後で確認する際に楽になります。
今回はEドライブ直下に保存すると仮定して、「E:\spreport_20251005_1200_1300.txt」と入力します。
これで通常レポートの取得は完了です。
通常レポートからOLD_HASH_VALUEを選ぶ
次に、取得した通常レポートからOLD_HASH_VALUEを選びます。
※OLD_HASH_VALUEは10桁の数字で記載されています
その際に見る箇所としておすすめなのは下記3つです。
・SQL ordered by CPU
このセクションは、CPU使用時間が多い順にSQL文を並べたものです。
CPUリソースを多く消費しているSQLを特定する際に役立ちます。
・SQL ordered by Elapsed Time for DB
このセクションは、SQLの実行にかかった経過時間(Elapsed Time)が多い順にSQL文を並べたものです。
実行時間が長いSQLを特定することで、ユーザー体感の遅延やバッチ処置の遅延の原因を探るのに役立ちます。
・SQL ordered by Gets
このセクションは、論理読み取り(Buffer Gets)が多い順にSQL文を並べたものです。
メモリ上のデータアクセスが多いSQLを特定する際に役立ちます。
この3つの項目でそれぞれ上位に表示されているSQLのOLD_HASH_VALUEを使用することで、性能問題の調査に役立つ詳細レポートを取得できる可能性が高まります。
詳細レポートを取得する
OLD_HASH_VALUEも選んだところで、いよいよ詳細レポートを取得します。
詳細レポートを取得するには、対象のサーバに接続し、「sprepsql.sql」を実行します。
①取得したスナップショットの一覧が表示される
②「begin_snapに値を入力してください:」と表示される
③「end_snapに値を入力してください:」と表示される
④「hash_valueに値を入力してください:」と表示される
⑤「report_nameに値を入力してください」と表示される
見ての通り、④のhash_valueを入力する手順が増えているくらいで、
それ以外は通常レポートを取得する手順と同じです。
②③の値は、通常レポートを取得した時と同じSnapIdを入力すればOKです。
④は先程調査した「OLD_HASH_VALUE」の中から1つを入力します。
「OLD_HASH_VALUE」1つごとに詳細レポートを取得することになるので、
「OLD_HASH_VALUE」の数だけ「sprepsql.sql」を実行する必要があります。
⑤の名称には、「E:\sprepsql_20251005_1200_1300_1234567890.txt」のように、通常レポートの名称の付け方に「OLD_HASH_VALUE」の値を付け足した名称にするのがおすすめです。
これで詳細レポートを取得することができました。
おわりに
今回はStatsPackのレポート取得について解説しました。
Oracleデータベースの性能問題調査に役立てて頂ければ幸いです。
ご覧頂きありがとうございました。