STATSPACKのインストールと使用

表領域を作成

  • STATSPACKが作成するテーブルとかを把握したいのでとりあえず専用表領域を作る。インストーラが推奨として選ぶのは SYSAUX だが。
  • 当初から100MB程度は容量をとる。200MB+収集回数で計算するぐらいでよい。
CREATE SMALLFILE TABLESPACE STATSPACK
  DATAFILE '/oradata/TESTDB01/dbf/statspack.01.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
  EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

STATSPACKを使うケース

使わなくてよいケース

下記の条件を全て満たす場合はSTATSPACKは不要だろう(10gおよび11gに対して)。要するにAWRをばりばり使えるかなり豪華な構成の場合だけ。ライセンスに関する部分なので詳細は都度各リリースのマニュアルにある『ライセンス情報』を参照。

  • Enterprise Edition を使用する
  • Diagnostics Pack を購入する
最初から入れておく

運用開始後は変更がなにかと大変になる。最初から入れて試験期間も通して常に運用して実績を確保してしまうのがよい。

OTN Japan - Oracleデータベース 性能対策機能 〜 StatspackとDiagnostics Packを使いこなす 〜 第1回 StatspackとDiagnostics Packの概要と使用方法』より引用。

Statspackのインストールをしていないシステムも実はあるのではないでしょうか。既に運用を開始しているシステムの場合、性能を分析するためにまずStatspackをインストールしなければならないのですが、システム管理者やお客様などにStatspackをインストールする許可を得なければならなくなります。また、設計書にもその変更内容を記載しなければなりません。Statspackのインストール作業そのものはとても簡単なのですが、いろいろと面倒なことが多く、肝心の性能分析がすぐに始められないなどの問題が生じます。よって、Statspackは忘れずに運用開始前からインストールしておきましょう。

インストール

sqlplus / as sysdba

SQL> @?/rdbms/admin/spcreate.sql

Choose the PERFSTAT user's password
-----------------------------------
Not specifying a password will result in the installation FAILING

perfstat_passwordに値を入力してください: PERFSTAT
PERFSTAT

Choose the Default tablespace for the PERFSTAT user
---------------------------------------------------
Below is the list of online tablespaces in this database which can
store user data.  Specifying the SYSTEM tablespace for the user's
default tablespace will result in the installation FAILING, as
using SYSTEM for performance data is not supported.

Choose the PERFSTAT users's default tablespace.  This is the tablespace
in which the STATSPACK tables and indexes will be created.

TABLESPACE_NAME 	       CONTENTS  STATSPACK DEFAULT TABLESPACE
------------------------------ --------- ----------------------------
STATSPACK		       PERMANENT
SYSAUX			       PERMANENT *

Pressing <return> will result in STATSPACK's recommended default
tablespace (identified by *) being used.

default_tablespaceに値を入力してください: STATSPACK

Using tablespace STATSPACK as PERFSTAT default tablespace.

Choose the Temporary tablespace for the PERFSTAT user
-----------------------------------------------------
Below is the list of online tablespaces in this database which can
store temporary data (e.g. for sort workareas).  Specifying the SYSTEM
tablespace for the user's temporary tablespace will result in the
installation FAILING, as using SYSTEM for workareas is not supported.

Choose the PERFSTAT user's Temporary tablespace.

TABLESPACE_NAME 	       CONTENTS  DB DEFAULT TEMP TABLESPACE
------------------------------ --------- --------------------------
TEMP			       TEMPORARY *

Pressing <return> will result in the database's default Temporary
tablespace (identified by *) being used.

temporary_tablespaceに値を入力してください: TEMP

Using tablespace TEMP as PERFSTAT temporary tablespace.


... Creating PERFSTAT user

・・・(中略)・・・

Creating Package STATSPACK...

パッケージが作成されました。

エラーはありません。
Creating Package Body STATSPACK...

パッケージ本体が作成されました。

エラーはありません。

NOTE:
SPCPKG complete. Please check spcpkg.lis for any errors.

確認してみると、STATS$ で始まるテーブルが70程度 STATSPACK 表領域に作成されていた。

アンインストール

SYSで実施する。インストール中にPERFSTATにユーザが切り替わるので、インストール失敗でアンインストールする場合はSYSで再接続すること。

SQL> @?/rdbms/admin/spdrop.sql
Dropping old versions (if any)

・・・(中略)・・・

NOTE:
SPDUSR complete. Please check spdusr.lis for any errors.

スナップショットをとってみる

レベル指定なしでとる(LEVEL 5になる)
SQL> execute statspack.snap

PL/SQLプロシージャが正常に完了しました。
レベル指定でとる(LEVEL 7)
SQL> execute statspack.snap(i_snap_level => 7)

PL/SQLプロシージャが正常に完了しました。

レベルと取得できる情報

一覧

OTN Japan - Oracleデータベース 性能対策機能 〜 StatspackとDiagnostics Packを使いこなす 〜 第1回 StatspackとDiagnostics Packの概要と使用方法』より引用。

i_snap_level 基本統計 アドバイス SQL統計 SQL詳細 セグメント 親・子ラッチ
Level 0
Level 5
Level 6
Level 7
Level 10

初期化パラメータSTATISTICS_LEVEL=TYPICALまたはALL(BASICでない)かつTIMED_STATISTICS=TRUEが条件

詳細

『プロとしてのSQLチューニング入門(Oracle 現場主義)』より引用。

  • Level0以上
    • 待機統計
    • システム・イベント
    • システム統計
    • ロールバック・セグメント・データ
    • 行キャッシュ
    • SGA
    • バックグラウンド・イベント
    • セッション・イベント
    • ロック統計
    • バッファ・プール統計
    • 親ラッチ統計
  • Level5以上
    • リソース使用率の高いSQLに関するパフォーマンス・データ(共有プール内のSQL数に比例)
  • Level6以上
    • リソース使用量の多い取得済みSQLのそれぞれのSQL実行計画
    • SQL計画使用状況データ
  • Level7以上
    • 使用頻度の高いセグメントに関するパフォーマンス・データ
    • RAC固有のセグメント・レベルの統計
  • Level10以上
    • 親ラッチおよび子ラッチの情報

レベル7までのオーバーヘッドは微々たるもので、全体のパフォーマンスに影響を及ぼすことはありません。そのため、インストール時に設定されているデフォルトのスナップショットのレベルは5ですが、Oracle 9i R2以降ではレベル7での取得をおすすめします。
レベル10で収集されるデータは、多くのリソースを消費するため、スナップショット作成の時間が長くなる原因になる可能性があります。そのため、特に必要がない限り、このレベルの使用はおすすめできません。

取得に要した時間

STATS$SNAPSHOT 表の SNAPSHOT_EXEC_TIME_S 列に秒単位(0.01秒まで保持)で取得に要した時間が記録されている。長過ぎる場合にはレベルを下げる事も検討する。

STATSPACKで取得したスナップショットを削除する

期間指定で削除する場合

スナップショットの一覧と削除範囲(下限(lo) - 上限(hi)指定)を求めるプロンプトが表示されるのでそれに沿って削除する。

SQL> @?/rdbms/admin/sppurge.sql

Specify the Lo Snap Id and Hi Snap Id range to purge
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
losnapidに値を入力してください: 1
Using 1 for lower bound.

hisnapidに値を入力してください: 3
Using 3 for upper bound.

Deleting snapshots 1 - 3.

Number of Snapshots purged: 3
~~~~~~~~~~~~~~~~~~~~~~~~~~~

Purge of specified Snapshot range complete.
全件をTRUNCATEで落とす場合(高速)

本当に削除してよいか確認プロンプトが表示されるので [ENTER] で実行(普通[ENTER]はキャンセル扱いだろ(汗))

SQL> @?/rdbms/admin/sptrunc.sql

Warning
~~~~~~~
Running sptrunc.sql removes ALL data from Statspack tables.  You may
wish to export the data before continuing.

About to Truncate Statspack Tables
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If would like to exit WITHOUT truncating the tables, enter any text at the
begin_or_exit prompt (e.g. 'exit'), otherwise if you would like to begin
the truncate operation, press <return>

begin_or_exitに値を入力してください: 
Entered at the 'begin_or_exit' prompt

... Starting truncate operation

・・・(中略)・・・

... Truncate operation complete

レポートを出力させてみる

spreport.sql を実行して比較したいスナップショットを 2 つ指定する(その間のスナップショット全てが考慮されるわけではなさそう)。スナップショットの番号以外にファイル名を求められ、そのファイルにもレポートが出力される。

SQL> @?/rdbms/admin/spreport.sql

Listing all Completed Snapshots

                                                       Snap
Instance     DB Name        Snap Id   Snap Started     Level Comment
------------ ------------ --------- ------------------ ----- --------------------
TESTDB01     TESTDB01             1 08 10月 2011 17:04     7
                                  2 08 10月 2011 17:05     7

Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
begin_snapに値を入力してください: 1
Begin Snapshot Id specified: 1

end_snapに値を入力してください: 2
End   Snapshot Id specified: 2

Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is sp_1_2.  To use this name,
press <return> to continue, otherwise enter an alternative.

report_nameに値を入力してください: snap1-2.txt

Using the report name snap1-2.txt

STATSPACK report for

・・・(レポート)・・・

End of Report ( snap1-2.txt )

SQLの実行詳細・実行計画を表示する

spreport.sql で出力したレポート内のSQL情報からハッシュ値(Old Hash Value)を抜き出して、sprepsql.sql で詳細出力する。

spreport.sql で出力したレポートからの抜粋

CPU時間でソートして上位のSQLとして報告されたSQLハッシュ値は 1429894190

SQL ordered by Elapsed time for DB: TESTDB01  Instance: TESTDB01  Snaps: 2 -3
-> Total DB Time (s):              18
-> Captured SQL accounts for   94.0% of Total DB Time
-> SQL reported below exceeded  1.0% of Total DB Time

  Elapsed                Elap per            CPU                        Old
  Time (s)   Executions  Exec (s)  %Total   Time (s)  Physical Reads Hash Value
---------- ------------ ---------- ------ ---------- --------------- ----------
     12.20            1      12.20   66.8      10.66               8 1429894190
Module: SQL Developer
SELECT   OBJECT_TYPE,   OBJECT_NAME,   TABLESPACE_NAME FROM   DB
A_OBJECTS O   LEFT OUTER JOIN DBA_SEGMENTS S     ON O.OWNER = S.
OWNER         AND O.OBJECT_NAME = S.SEGMENT_NAME   AND   O.OBJEC
T_TYPE IN ('TABLE', 'INDEX') WHERE   O.OWNER = 'PERFSTAT' ORDER
sprepsql.sql で詳細レポート

sprepsql.sql を実行すると spreport.sql を実行した場合と同様に比較するスナップショットを 2 つ指定するよう求められる。spreport.sql で指定したものを指定し、さらにハッシュ値が求められるので、解析対象のSQLハッシュ値を入力する。spreport.sql と同様にファイル名を求められ、そのファイルにもレポートが出力される。

SQL> @?/rdbms/admin/sprepsql.sql

Listing all Completed Snapshots

                                                       Snap
Instance     DB Name        Snap Id   Snap Started     Level Comment
------------ ------------ --------- ------------------ ----- --------------------
TESTDB01     TESTDB01             1 08 10月 2011 17:04     7
                                  2 08 10月 2011 17:05     7
                                  3 08 10月 2011 17:16     7

Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
begin_snapに値を入力してください: 2
Begin Snapshot Id specified: 2

end_snapに値を入力してください: 3
End   Snapshot Id specified: 3

Specify the old (i.e. pre-10g) Hash Value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hash_valueに値を入力してください: 1429894190
Hash Value specified is: 1429894190

Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is sp_2_3_1429894190.  To use this name,
press <return> to continue, otherwise enter an alternative.

report_nameに値を入力してください: 1429894190.txt

Using the report name 1429894190.txt


STATSPACK SQL report for Old Hash Value: 1429894190  Module: SQL Developer

DB Name         DB Id    Instance     Inst Num Release     RAC Host
------------ ----------- ------------ -------- ----------- --- ----------------
TESTDB01      2628464059 TESTDB01            1 11.2.0.1.0  NO  oracle.localdoma
                                                               in

 Start Id     Start Time         End Id      End Time       Duration(mins)
--------- ------------------- --------- ------------------- --------------
        2 08-10月-11 17:05:04         3 08-10月-11 17:16:02          10.97

SQL Statistics
~~~~~~~~~~~~~~
-> CPU and Elapsed Time are in seconds (s) for Statement Total and in
   milliseconds (ms) for Per Execute
                                                       % Snap
                     Statement Total      Per Execute   Total
                     ---------------  ---------------  ------
        Buffer Gets:       2,781,504      2,781,504.0   77.68
         Disk Reads:               8              8.0    1.19
     Rows processed:              50             50.0
     CPU Time(s/ms):              11         10,661.4
 Elapsed Time(s/ms):              12         12,195.6
              Sorts:               1              1.0
        Parse Calls:               1              1.0
      Invalidations:               0
      Version count:               1
    Sharable Mem(K):             324
         Executions:               1

SQL Text
~~~~~~~~
SELECT   OBJECT_TYPE,   OBJECT_NAME,   TABLESPACE_NAME FROM   DB
A_OBJECTS O   LEFT OUTER JOIN DBA_SEGMENTS S     ON O.OWNER = S.
OWNER         AND O.OBJECT_NAME = S.SEGMENT_NAME   AND   O.OBJEC
T_TYPE IN ('TABLE', 'INDEX') WHERE   O.OWNER = 'PERFSTAT' ORDER
BY   OBJECT_TYPE, OBJECT_NAME

Known Optimizer Plan(s) for this Old Hash Value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Shows all known Optimizer Plans for this database instance, and the Snap Id's
they were first found in the shared pool.  A Plan Hash Value will appear
multiple times if the cost has changed
-> ordered by Snap Id

  First        First           Last           Plan
 Snap Id     Snap Time      Active Time     Hash Value        Cost
--------- ---------------- ---------------- ------------ ----------
        3 08-10月-11 17:16 08-10月-11 17:15   3548308502   1973217

Plans in shared pool between Begin and End Snap Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Shows the Execution Plans found in the shared pool between the begin and end
snapshots specified.  The values for Rows, Bytes and Cost shown below are those
which existed at the time the first-ever snapshot captured this plan - these
values often change over time, and so may not be indicative of current values
-> Rows indicates Cardinality, PHV is Plan Hash Value
-> ordered by Plan Hash Value

--------------------------------------------------------------------------------
| Operation                      | PHV/Object Name     |  Rows | Bytes|   Cost |
--------------------------------------------------------------------------------
|SELECT STATEMENT                |----- 3548308502 ----|       |      |1973217 |
|SORT ORDER BY                   |                     |     1M|  158M|1973217 |
| NESTED LOOPS OUTER             |                     |     1M|  158M|1935327 |
|  VIEW                          |DBA_OBJECTS          |     1K|  150K|     64 |
|   UNION-ALL                    |                     |       |      |        |
|    TABLE ACCESS BY INDEX ROWID |SUM$                 |     1 |   11 |      1 |
|     INDEX UNIQUE SCAN          |I_SUM$_1             |     1 |      |      0 |
|                                |                     |       |      |        |
|    ......                      |                     |       |      |        |
|                                |                     |       |      |        |
|          INDEX RANGE SCAN      |I_FILE#_BLOCK#       |     1 |      |      1 |
--------------------------------------------------------------------------------

End of Report

STATSPACK の内情

V$xxx は STATS$xxx にコピーされる

例えば、STATS$SGAはV$SGAの情報をコピーしている。ただし、当然と言えば当然だが SNAP_ID、DBID、INSTANCE_NUMBERなどスナップショット特有の列が追加されている。

スナップショットの取得履歴は STATS$SNAPSHOT で確認できる

spreport.sql などでも表示されるが、直接確認する場合には STATS$SNAPSHOT テーブルを確認すれば良い。SNAP_IDや取得日時(SNAP_TIME)が直接確認できる。