チューニング(SQL解析ツール編)

開発者必見?!

SQLチューニング用の標準解析ツールがいろいろ用意されている。


SQL_TRACE

実行時間やディスクアクセスに関する情報を取得できる。

<準備>
調査したいユーザにてログインし、情報取得フラグ/時間統計取得フラグを有効化する。
alter session set sql_trace=true;
alter session set timed_statistics=true;

<実行>
調査したいSQLを実行する。

あとしまつ↓
ログアウト
or
alter session set sql_trace=false;
alter session set timed_statistics=false;


<解析>
初期化パラメータ udump に設定したフォルダに、トレースファイル(拡張子.trc)が作成されているはず。
OSコマンドtkprofを使って解析可能な形式に変換する。

tkprof トレースファイル名 出力先ファイル名(*.txtにでもしときゃいい)

作成ファイルの例)
********************************************************************************
delete from AAA
 
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.01          0          0          0           0
Execute      1      0.00       0.10          1          7          3           1
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.00       0.11          1          7          3           1
 
Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 23  
 
Rows     Row Source Operation
-------  ---------------------------------------------------
      0  DELETE  
      1   TABLE ACCESS FULL AAA 
 
********************************************************************************
列のcpu,diskなどに注目する。これを減らす努力をすることでパフォーマンスアップ!


EXPLAIN PLAN

実行計画に関する情報を取得できる。

<準備>
調査対象ユーザにて、実行計画保存用のテーブルを作成する。
@C:\oracle\product\920\rdbms\admin\utlxplan.sql

sysユーザにて、EXPLAIN PLANを利用するためのロール(PLUSTRACE)を作成する。
@C:\oracle\product\920\sqlplus\admin\plustrce.sql

さらに、調査対象ユーザに権限を付与する。
grant plustrace to ユーザ名;

※準備作業はデータベースに対して一回行うのみでよい。
※ただしテーブル作成/権限付与は調査対象ユーザごとに必要。

<実行>
調査対象ユーザにてログインし、
set autotrace on
を実行したあとで、調査したいSQLを実行する。

あとしまつ↓
ログアウト
or
set autotrace off


<解析>
SQL_TRACEのような追加手順は不要。
実行結果の直後に、以下のような解析情報が表示される。
実行計画
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (FULL) OF 'AAA'
 
統計
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          7  consistent gets
          0  physical reads
          0  redo size
        228  bytes sent via SQL*Net to client
        372  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed
実行計画の情報にて、インデックス利用がされているかなどを確認する。
表示例の場合だと、テーブルAAAに対してFULLスキャンが実行されているとわかる。


補足

上記2つのツールは、ある個別のSQLの解析を行うのに適している。
たとえば
・プログラム開発中に自分の書いたSQLをチェックする
・チューニング問題の原因となっているSQLが既に判明している
などの時に有効利用できる。

データベース全体の問題を調査したい場合には、標準ツールのstatspackなどの利用を検討すればよい。