Oracle Databaseを運用している中で、STATSPACKやAWRを定期的に取得して、分析や性能改善を行ったりしていますか?
定期的に見ることは無くても、性能問題や障害のタイミングで見たことがある人は多いと思います。
まずは、そもそもSTATSPACKって何?どんな情報が取得できるの?といったところから解説していきます。
STATSPACKの特徴
STATSPACKとは
STATSPACKはDatabase全体の性能情報になります。
OSの負荷状況、Oracleの負荷状況、Oracleリソースの使用状況等が確認できます。
この各情報をもとに性能状況や問題点の切り分けが可能です。
分類 | STATSPACKから確認できる項目 |
OS負荷状況 | CPU使用率 |
メモリ使用率 | |
Oracle負荷状況 | SQL実行回数 |
トランザクション量 | |
CPU時間 | |
REDO生成量 | |
論理読込量 | |
物理読込量 | |
データ送受信量 | |
Oracleリソース使用状況 | DBバッファキャッシュヒット率 |
メモリソート率 | |
ソフトパース率 | |
リソースしきい値 | |
Oracleボトルネック | 待機イベント分析 |
データファイルのI/O待機時間 | |
行連鎖・行移行の有無 | |
SQLセクション | 処理時間が長いSQL |
論理読込が多いSQL | |
物理読込が多いSQL | |
実行回数が多いSQL |
STATSPACKはオラクル標準の性能分析ツールで、Oracle 8i(1999年)より実装されており、Oracle19cがリリースされた現在も使用できる。
Enterprise Editionだけでなく、Standard Editionでも使用でき、更に無料のため全ての環境に対応。
STATSPACKの仕組み
異なる時点での情報をスナップショットとして記録し、任意の2時点における差分の平均値をレポートとして出力します。
レポート出力時にどのスナップショットを使用するか指定するだけで、出力範囲を柔軟に変更することが可能です。
ですので、JOBやcronなどで定期実行させるのが一般的です。
また、STATSPACKレポートの「SQL ordered by…」の欄にはそれぞれの単位(CPU、経過時間、物理I/Oなど)で悪かった順にSQLの一覧が表示されるため、それらのSQLの詳細(実行計画)を知ることができます。
(※ただし、Level6以上での採取が必須)
注意点として、STATSPACKのしきい値を越えたSQLしかスナップショットに保存されないため、対象期間内に実行された全てのSQLを分析できるわけではありません。
STATSPACKが不向きなケース
STATSPAKCはある2つの時点間の各種統計をレポートとして出力します。
しかし、瞬間的に発生する事象はSTATSPACKでは分析しきれないなどの弱点があります。
例えば、STATSPACKのスナップショットは1時間に1回単位なのに、あるイベントが数秒間に集中して起こった場合などです。
実際には、その数秒間の集中が性能トラブルの原因となっているのですが、STATSPACKでは1時間の合計としてその事象を捉えるため、そのイベントがある特定の時間に集中していることを見つけ出すことができません。
STATSPACKの使用にあたって
STATSPACKの運用方法の推奨は?
30分~1時間程度の間隔で常時取得をすることを推奨します。
1レポートの間隔が長すぎると、データが平均化されて、特定の問題が検知しにくくなります。
また、問題発生時のみ取得しても状況判断がしにくいため、「通常の状態」も取得しておくことが大事になります。
保存期間を決めて古くなったものは定期的に削除するようにしてください。
STATSPACKの運用に必要な容量は?
STATSPACKのインストールには、約64MBが必要です。
スナップショット保存用に必要な領域のサイズは、スナップショットの回数、データベースの処理量などによって異なりますが、まずは300MB~500MB程度を用意しておくことをおススメします。
STATSPACKの取得間隔はどれくらいにすべきか?
フェーズごとで変更するのが好ましいです。
- 設計や運用:30~60分間隔で収集。
- テスト:性能テスト時間を加味した上で、テストの前中後それぞれで性能が確認できる間隔とすること。例えば、負荷のピーク時間帯を5ショット以上比較できるように取得する等。
既存の表領域を使っても良いのでしょうか?
問題ありません。しかし、管理面から、ユーザーデータと分離することをおススメします。
専用の領域を用意しておけば、不要になったときに、領域をまとめて削除することが可能です。
既存の表領域を使う場合も、SYSTEM表領域を指定しないでください。
(SYSTEM表領域を指定するとインストールエラーで終了します。)
STATSPACKの負荷は?
STATSPACKの実態はプロシージャと実行スクリプトのため、インストール自体でサーバーの負荷に影響を与えることはありません。
スナップショットの取得も、通常はそれほど負荷がかかることはありません。
(Level10のスナップショットでは負荷がかかる可能性があります。)
しかし、CPUリソースを使用するためCPU負荷の高い時間帯は避けてレポート化を実施して下さい。
STATSPACKだけではわからないことは?
DBサーバのOS情報はわかりません。(※一部例外あり)
そのため、vmstat、iostatなどのOS情報は定期的に収集して下さい。
STATSPACKの収集レベル
デフォルトではLevel5の設定となっていますが、分析の際に役立つ情報量の違いから、Level7での取得を推奨します。
また、Level10は負荷が高いため、通常は使用せず、Oracleサポート等から支持されたときのみが望ましいです。
AWRの特徴
前提条件
AWRを使用するには「Oracle Database Enterprise Edition」の利用に加え、「Diagnostics Pack」オプションライセンスが必要です。
10g以降ではチューニングを自動化/アドバイスするための多数の機能を提供しています。
- Automatic Database Diangostic Monitor(ADDM)
- SQL Access Advisor/SQL Tuning Adviser/UNDOアドバイザ/セグメント・アドバイザ
これらの元となる統計情報は自動収集/管理を一括で行なっており、この機能を自動ワークロードリポジトリ(AWR)といいます。
(※実行計画の基となる「統計情報」とは異なる)
AWRでは定期的(デフォルト:1時間間隔)に様々な統計を収集し、その集合をスナップショットとして一定期間(デフォルト:10gR2以前は7日間、11gR1以降は8日間)保存します。
AWRで取得したスナップショットを基にシステムの状況をレポートすることが可能です。AWRレポートの内容はSTATSPACKレポートとほぼ同じです。
そのため、AWRでスナップショットを自動収集していればSTATSPACKを使用する必要はほぼありません。
AWRレポートにはSTATSPACKと比べて以下のような利点があります。
- 管理者が手動でスナップショットを取得する必要がありません
- レポートの形式はTEXTとHTMLを選択することが可能
- STATSPACK同様、SQLの実行計画の確認も可能
- STATSPACKでは収集されない統計情報に関する解析が行われます
STATSPACKとAWRの比較
性能レポート名 | STATSPACK | AWR |
バージョン | Oracle Database 8i〜 | Oracle Database 10g〜 |
エディション・ライセンス | Enterprise Edition/Standard Editionともに使用可能 | Enterprise EditionかつDiagnostics Packライセンスが必要 |
準備 | インストール要 | インストール不要 |
操作性 | コマンドラインによる操作のみ | コマンドラインまたはEnterprise Managerによる操作 |
スナップショットの生成 | 手動のみ | 自動または手動 |
レポートの出力形式 | テキスト形式のレポートのみ | テキストまたはHTML形式のレポート |
セッション分析 | V$SESSION(V$SESSION_WAIT)を分析することで可能。V$SESSIONを定期的に取得、保存する仕組みを作成する必要あり | ASHを分析することで可能。ASHによって自動取得。サンプル間隔の変更は原則としてできない。 |
実行計画 | 確認可能(※Level 6以上での採取が必須) | 確認可能 |
STATSPACKを基準とした出力項目 | – | STATSPACKでは収集されない統計情報に関する解析実施(採取レベルの設定は無い) |