[Oracle] Oracle 10g における Statspack の使用方法 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

Statspack はパフォーマンス上の問題点を診断する Oracle 標準のツールで、Oracle 8i から提供されています。

Oracle 10g では Statspack に置き換わる機能として、自動ワークロードリポジトリ(AWR)という新機能がリリースされたため、Statspack はマニュアル(Oracle Database パフォーマンス・チューニング・ガイド)から削除されてしまっていますが、機能自体は存続しています。

(Statspack がこのような扱いになっているのは、AWR を使用するには Diagnostic Pack というオプションのライセンスが必要であるために、実際問題としてほとんどのユーザーが Statspack に相当する機能を使えなくなってしまうからではないかと推測しています。)

ということで、Oracle 10g で Statspack を使用するには 9i の Statspack のマニュアルを参考にするか、spdoc.txt という英語のテキストマニュアルを参考にするしかないわけですが、以下に基本的な使用方法を簡単にまとめてみました。

1.Statspack のインストール

Statspack を使用するにはインストールが必要です。

Statspack のインストールは以下の要領で行います。

1)SQL*Plus から SYS ユーザーでログインします。

SQL> connect sys/<password> as sysdba

2)spcreate.sql を実行します。

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

3)Statspack が使用する PERFSTAT というユーザーのパスワードを入力します。

perfstat_passwordに値を入力してください:<password>

4)Statspack が使用する表領域を指定します。

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

5)Statspack が使用する一時表領域を指定します。

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


2.スナップショットの自動収集設定

Statspack を使用してパフォーマンス上の問題を診断するには、まず診断に必要な統計情報を収集したスナップショットをあらかじめ作成しておく必要があります。

診断は特定の時間範囲について行いますので、診断の開始点と終了点、少なくとも2つのスナップショットが必要になりますが、問題が発生した時にいつでも任意の時間範囲でパフォーマンスを分析・比較できるようにするために、一定の時間間隔で自動的にスナップショットを作成するのが好ましい運用となります。

定期的に自動でスナップショットを作成するにはいくつかの方法がありますが、DBMS_SCHEDULER パッケージの機能を利用する場合は以下のようなスクリプトを作成して実行します。

※ SYS ユーザーで実行する必要があります。

BEGIN
  DBMS_SCHEDULER.CREATE_PROGRAM(
    program_name => 'PERFSTAT.STATSPACK_SNAP_PROGRAM',
    program_type => 'plsql_block',
    program_action => 'BEGIN STATSPACK.SNAP(i_snap_level=>7); END;',
    number_of_arguments => 0,
    enabled => true,
    comments => 'Statspackスナップショット作成プログラム'
  );
  DBMS_SCHEDULER.CREATE_SCHEDULE(
    schedule_name => 'PERFSTAT.STATSPACK_SNAP_SCHEDULE',
    start_date => SYSTIMESTAMP,
    repeat_interval => 'FREQ=HOURLY; INTERVAL=1',
    comments => 'Statspackスナップショット作成スケジュール'
  );
  DBMS_SCHEDULER.CREATE_JOB(
    job_name => 'PERFSTAT.STATSPACK_SNAP_JOB',
    program_name => 'PERFSTAT.STATSPACK_SNAP_PROGRAM',
    schedule_name => 'PERFSTAT.STATSPACK_SNAP_SCHEDULE',
    enabled => true,
    auto_drop => false,
    comments => 'Statspackスナップショット作成ジョブ'
  );
END;
/
このスクリプトでは、1時間ごとにレベル7のスナップショットを作成するよう設定しています。


3.Statspack レポートの作成

Statspack を使用してパフォーマンス上の問題を診断するには、診断に必要なスナップショットを作成した上で、Statspack レポートを出力します。

1)SQL*Plus から SYS ユーザーでログインします。

SQL> connect PERFSTAT/<password>

2)spreport.sql を実行します。

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

3)開始スナップショットIDと終了スナップショットIDを指定します。

Listing all Completed Snapshots

                                                       Snap
Instance     DB Name        Snap Id   Snap Started    Level Comment
------------ ------------ --------- ----------------- ----- --------------------
orcl         ORCL                 1 07 9月  2007 10:0     7
                                    0
                                  2 07 9月  2007 11:0     7
                                    0
                                  3 07 9月  2007 12:0     7
                                    0
                                  4 07 9月  2007 13:0     7
                                    0



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

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

4)出力するレポートファイル名を入力します。

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

※ここではレポートの見かたについては触れません。


4.スナップショットの削除
スナップショットは明示的に削除しない限りは PERFSTAT スキーマのテーブルにたまり続けますので、不要になったスナップショットは定期的に削除したほうがよいでしょう。

DBMS_SCHEDULER パッケージの機能を利用する場合は以下のようなスクリプトを作成して実行します。

※ SYS ユーザーで実行する必要があります。

BEGIN
  DBMS_SCHEDULER.CREATE_PROGRAM(
    program_name => 'PERFSTAT.STATSPACK_PURGE_PROGRAM',
    program_type => 'plsql_block',
    program_action => 'BEGIN STATSPACK.PURGE(i_purge_before_date=>SYSDATE-7); END;',
    number_of_arguments => 0,
    enabled => true,
    comments => 'Statspackスナップショット削除プログラム'
  );
  DBMS_SCHEDULER.CREATE_SCHEDULE(
    schedule_name => 'PERFSTAT.STATSPACK_PURGE_SCHEDULE',
    start_date => SYSTIMESTAMP,
    repeat_interval => 'FREQ=DAILY; BYHOUR=1; BYMINUTE=0; BYSECOND=0',
    comments => 'Statspackスナップショット削除スケジュール'
  );
  DBMS_SCHEDULER.CREATE_JOB(
    job_name => 'PERFSTAT.STATSPACK_PURGE_JOB',
    program_name => 'PERFSTAT.STATSPACK_PURGE_PROGRAM',
    schedule_name => 'PERFSTAT.STATSPACK_PURGE_SCHEDULE',
    enabled => true,
    auto_drop => false,
    comments => 'Statspackスナップショット削除ジョブ'
  );
END;
/

このスクリプトでは毎日午前1時に7日以上経過したスナップショットを削除するよう設定していますが、スケジュールに関しては標準で設定されているウィンドウ(WEEKNIGHT_WINDOW、WEEKEND_WINDOW)を利用してもいいかと思います。

5.Statspack のアンインストール

Statspack のアンインストールは以下の要領で行います。

1)SQL*Plus から SYS ユーザーでログインします。

SQL> connect sys/<password> as sysdba

2)spdrop.sql を実行します。

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


以上、これだけやっておけば、何か問題があったときに Statspack レポートを出力し、パフォーマンスを分析することができると思います。