STATSPACKの少し便利な機能を使ってみよう。(レベル6編)
今日はスナップショットレベル(デフォルト「5」、最大「10」)の変更によって
取得できる情報を確認してみる事にする。
今後の案件で活用する為に、社内での検証もしておかないと。
◆レベル6:SQL実行計画の表示
9iR1(9.0.1)から、レベル6でのスナップショット取得により、
SQLの実行計画が確認できるようになったらしい。
以前は、STATSPACKのレポートから重いSQLが確認できたとしても、
そのSQLの実行計画を確認するには、SQLトレースを取得しなければ
いけなかったから、これは便利そうだな。
早速、試してみよう。
ではまず、レベル6で取得してみよう。
SQL> conn perfstat/password
SQL> execute statspack.snap (i_snap_level => 6);
それで、適当にフルスキャンが発生するようなSQLを実行して・・・
実行後に、スナップショットを取得する。(上記と同じコマンド発行)
では、まずは普通にレポートを作成して中身を見てみよう。
SQL> conn perfstat/password
SQL> @$ORACLE_HOME/rdbms/admin/spreport.sql
・
・
・
問題のSQLを発見。
********************************************************************************
CPU Elapsd
Buffer Gets Executions Gets per Exec %Total Time (s) Time (s) Hash Value
--------------- ------------ -------------- ------ -------- --------- ----------
12,795 1 12,795.0 58.6 0.59 1.26 1315228457
Module: SQL*Plus
select count(*) from TEST_TAB1 where COL1 like '%a%'
********************************************************************************
中間一致検索のSQLですね。
当然フルスキャンが発生しているのですが・・・
まあまあ、ここからが本題!
sprepsql.sqlを実行し、このレポート中の「Hash Value」値を使用する事で、
実行計画が表示できるらしい。
では、やってみよう。
SQL> conn perfstat/password
SQL> @$ORACLE_HOME/rdbms/admin/sprepsql.sql
・
・
・
通常のレポート作成と同様にbeginとendのsnap_idを指定して・・・
次のところで「Hash Value」値を指定する。
Specify the Hash Value
~~~~~~~~~~~~~~~~~~~~~~
hash_valueに値を入力してください: 1315228457
Hash Value specified is: 1315228457
以降は同様にレポート名を指定すると出来上がり!
レポートの内容は、こんな感じになりました。
********************************************************************************
--------------------------------------------------------------------------------
| Operation | PHV/Object Name | Rows | Bytes| Cost |
--------------------------------------------------------------------------------
|SELECT STATEMENT |----- 184110842 -----| | | 1939 |
|SORT AGGREGATE | | 1 | 22 | |
| PARTITION RANGE ALL | | | | |
| TABLE ACCESS FULL |TEST_TAB1 | 52K| 1M| 1939 |
--------------------------------------------------------------------------------
********************************************************************************
フルスキャンが発生している事を確認できました。
今回の例は簡単なSQLでしたが、結構使えそうな機能です。
<今日のおさらい>
9iからは、レベル6の指定によって、SQLの実行計画が確認できるようになった。
◆レベル6でのスナップショット取得コマンド
execute statspack.snap (i_snap_level => 6);
◆SQL実行計画表示スクリプト
@$ORACLE_HOME/rdbms/admin/sprepsql.sql
※全てPERFSTATユーザで実行