パフォーマンス調査でお役立ち! AWRスナップショットの紹介
目次
こんにちは、林です。
Oracle Databaseを使用したシステムの保守業務を行うようになって1年以上が経ち、最近はSQLのパフォーマンス調査を任せてもらえることが増えてきました。
パフォーマンス調査自体が初めてのことだったのですが、ネットで調べつつ、なんとかこなしています。
今回は自分の備忘録の意味も込めて、パフォーマンス調査で必ず調べているAWRスナップショットと、調査のとき特に注視しているカラムをご紹介したいと思います。
業務で使用しているバージョンはこちらです。
- Oracle Database
- 11g
- SI Object Browser
- 9.0.1.4
そもそもAWRとは?
自動ワークロードリポジトリ(Automatic Workload Repository)のことで、データベースの情報を自動的に収集・管理する機能です。Oracle Database 10gより提供されました。
データベースが稼働している間の様々な状態は動的パフォーマンス・ビュー(「V$~」で始まるビュー)に記録されます。動的パフォーマンス・ビューはメモリ上に記録されるため、その内容は永続的に保持されません。
AWRは動的パフォーマンス・ビューから情報を取得し、スナップショットデータ(「DBA_HIST_~」で始まるテーブル)としてデータベース内に保存します。
デフォルトでは60分ごとに取得し、8日間保持することができます。
DBA_HIST_SQLTEXT
実行されたSQLの全文が保存されています。構成しているカラムはこちら。
※ Oracle Databaseリファレンスより
カラム | 説明 |
---|---|
DBID | データベースID |
SQL_ID | ライブラリ・キャッシュ内の親カーソルのSQL識別子 |
SQL_TEXT | CLOB列として公開されたSQL文の全テキスト |
COMMAND_TYPE | Oracleコマンド・タイプ定義 |
SQLの識別子である[SQL_ID]をキーに検索すれば、実行されたSQLの全文を取得することができます。ただし[SQL_TEXT]はCLOB型なので、取得する際はVARCHAR2型への変換が必要です。
[COMMAND_TYPE]には数値により、SELECTなどのSQLのパターンを表しています。
DBA_HIST_SQL_PLAN
SQLの実行計画情報が保存されています。主なカラムはこちら。
※ Oracle Databaseリファレンスより
カラム | 説明 |
---|---|
SQL_ID | ライブラリ・キャッシュ内の親カーソルのSQL識別子 |
PLAN_HASH_VALUE | カーソルに対するSQLプランの数値表現 |
ID | 実行計画の手順ごとに割り当てられた番号 |
OPERATION | この手順で実行される内部操作の名前(たとえば、TABLE ACCESS) |
OPTIONS | OPERATION列で示されている操作のバリエーション(たとえば、FULL) |
OBJECT_NAME | 表名または索引名 |
DEPTH | ツリー内の操作の深さ(レベル) |
TIMESTAMP | プランが生成された時点のタイムスタンプ |
[SQL_ID]をキーに、対象のSQLの実行計画を取得することができます。実行計画の数値表現が[PLAN_HASH_VALUE]なので、同じ[SQL_ID]で[PLAN_HASH_VALUE]の値が異なる場合は実行計画が変動している、ということになります。
実行計画が生成された時間は[TIMESTAMP]でわかるので、実行計画が変動したときの操作を知る手掛かりになります。
DBA_HIST_ACTIVE_SESS_HISTORY
セッション情報のスナップショットで、「ASH」と略されます。主なカラムはこちら。
※ Oracle Databaseリファレンスより
カラム | 説明 |
---|---|
SNAP_ID | 一意のスナップショットID |
SAMPLE_ID | サンプルのID |
SAMPLE_TIME | サンプルの時間 |
SESSION_ID | セッション識別子 |
SESSION_SERIAL# | セッション・シリアル番号(セッションのオブジェクトを一意に識別するために使用される) |
SQL_ID | 現在実行されているSQL文のSQL識別子 |
SQL_PLAN_HASH_VALUE | カーソルに対するSQLプランの数値表現 |
SQL_PLAN_LINE_ID | SQLプランの行ID |
SQL_EXEC_START | SQLの実行が開始された時刻 |
EVENT | SESSION_STATE = WAITINGの場合は、サンプリング時にセッションが待機していたイベント。 SESSION_STATE = ON CPUの場合、この列はNULL。 |
WAIT_CLASS | サンプリング時にセッションが待機していたイベントの待機クラス名 |
SESSION_STATE | セッションの状態(以下のいずれかが設定される): ・WAITING ・ON CPU |
BLOCKING_SESSION | ブロックしているセッションのセッション識別子 |
BLOCKING_SESSION_SERIAL# | ブロックしているセッションのシリアル番号 |
10秒ごとにまとめられるスナップショットデータです。[SNAP_ID]や[SQL_ID]、[SQL_EXEC_START]などをキーに、スナップショットにまとめた時間を保存している[SAMPLE_TIME]の昇順に取得すれば、10秒ごとのセッションの状態を調べることができます。
[BLOCKING_SESSION]や[BLOCKING_SESSION_SERIAL#]で、待機中のときに稼働していたセッションを知ることができるなど、ASHを取得することで多くの情報が得られます。
まとめ
いかがでしたか?
今回ご紹介した3つのスナップショット、特にASHを取得すれば、パフォーマンス調査の足掛かりにすることができます。他にもスナップショットデータはたくさんあるので、調査に役立ったものはまたご紹介したいと思います。
それでは。