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ユーザで実行