パフォーマンス調査でお役立ち! 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のパターンを表しています。

  • 2:INSERT
  • 3:SELECT
  • 6:UPDATE
  • 7:DELETE
  • 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を取得すれば、パフォーマンス調査の足掛かりにすることができます。他にもスナップショットデータはたくさんあるので、調査に役立ったものはまたご紹介したいと思います。
     
    それでは。

    記事をシェア
    MOST VIEWED ARTICLES