8-1. Statspackのインストール

ここではStatspackのインストール方法~スナップショットの取得方法までを記します。

作業に際しては、SYSユーザーでSQL*Plusにログインします。

プラガブルDBを使用している場合は、使用するPDBにログインします。
Statspackは、1つのインスタンスにPERFSTATというスキーマを作成して使用するものですので、複数のPDBを使用する場合は、PDBごとにインストールする必要があります。

事前の検討事項

 Statspackのインストールでは、ユーザーPERFSTATが作成されます。
 それに伴い、PERFSTATユーザーのパスワード、及び、DEFAUT表領域と一時表領域を指定する必要があります。

 PERFSTAT専用の表領域を使用する場合は、事前に作成しておきます。

create tablespace perfstats datafile '<<データファイルを配置するディレクトリ>>/perfstats.dbf' size 200m autoextend on segment space management auto;

インストール

SQL*Plusから、下記のコマンドを実行します。
「@?」は、$ORACLE_HOME を表します。
このように記述すれば、WindowsでもLinuxでも同じようにパスを指定できます。

@?/rdbms/admin/spcreate.sql

次のようにパスワードを聞かれるので入力します。

Choose the PERFSTAT user's password
-----------------------------------
:
perfstat_passwordに値を入力してください:

続いてデフォルト表領域を選択します。

Choose the Default tablespace for the PERFSTAT user
---------------------------------------------------
:
default_tablespaceに値を入力してください:

と聞かれるので、表領域名を入力してください。
入力しない場合、STATSPACK DEFAULT TABLESPACEに*が表示されている表領域が使用されます(通常はSYSAUXだと思います)。

次に一時表領域を選択します。

Choose the Temporary tablespace for the PERFSTAT user
-----------------------------------------------------
:
temporary_tablespaceに値を入力してください:

入力しない場合、DB DEFAULT TEMP TABLESPACEに*が表示されている表領域が使用されます(通常はTEMPだと思います)。

あとはスクリプトが実行されて、必要なオブジェクトが作成されます。

スナップショットの作成

Statspackがインストールできたら、早速スナップショットを取得し、レポートを作成してみます。

  1. perfstatユーザーでSQL*Plusにログインします。
  2. スナップショットレベルの設定 execute statspack.snap(i_snap_level=>7);

指定するレベルの数値の意味は以下の通りです。

レベル収集される情報
0全体的なパフォーマンス統計
5+SQLステートメント
6+SQL実行計画および SQL実行計画の使用率
7+セグメントレベルの統計
10+親ラッチおよび子ラッチ

 収集される情報の「+」は一つ上の行の収集内容に追加して収集されるということです。
 レベル5であれば、「全体的なパフォーマンス統計」に加えて、「SQL ステートメント」も収集されるということです。
 通常は、上記の例でも示しているとおり、”7”を指定することをお勧めします。
 10ではスナップショットの取得が重くなりますし、”6”ではいわゆるI/Oバウンドの性能低下を判断するための情報が不足します。
 

3. 次のコマンドを発行して、スナップショットを取得します。

execute statspack.snap;

4. スナップショット取得確認

次のSQLを発行し、スナップショットが作成されていることを確認します。

select snap_id, to_char(snap_time, 'yyyy-mm-dd hh24:mi:ss') snap_time
 from stats$snapshot order by snap_id;

5. レポートの出力

下記のスクリプトを実行します。

@?/rdbms/admin/spreport

すると以下のような情報が出力されます。
スナップショットIDの入力を求められるので、出力対象(時間)の開始IDと終了ID、レポートファイル名を指定します。
下記では、10/21の18:00~20:00までのレポートを出力します。
レポートはSQL*Plusを起動したディレクトリに出力されますが、明示的にフルパスを指定した方がわかりやすくて良いと思います。

                         Snap                    Snap
Instance   DB Name         Id   Snap Started     Level Comment
---------- ---------- ------- ------------------ ----- -------
t17        TF17ORA          1 22 10月 2021 00:14     7
                            2 22 10月 2021 01:00     7
                            :<< 中略 >>
                           19 22 10月 2021 18:00     7
                           20 22 10月 2021 19:00     7
                           21 22 10月 2021 20:00     7
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
begin_snapに値を入力してください: 19
Begin Snapshot Id specified: 19
 
end_snapに値を入力してください: 21
End   Snapshot Id specified: 21
 
report_nameに値を入力してください: D:\oracle\sprep_19-21.log

レポートの見方についてはまた別途解説したいと思います。

スケジューリング

スナップショットは一度だけ取得しても意味はありません。
前述のように、レポートは所定の時間の間に行われた処理内容を出力するものですので、定期的に取得するのが一般的です。

1時間毎にスナップショットを取得するジョブを生成するには、下記のスクリプトを実行します。

@?/rdbms/admin/spauto

次のSQLで、ジョブが作成されたか確認します。

select job, what from dba_jobs;

スナップショット取得間隔を変更したい場合は、次のコマンドを実行します。
これは取得間隔を30分ごとに変更する場合です。
尚、ジョブIDには、上のSQLで取得したjob_idを指定します。

execute dbms_job.interval([ジョブID], 'sysdate+(1/48)');

ジョブを削除する場合は、下記のコマンドを実行します。

execute dbms_job.remove([ジョブID]);

statspackのアンインストール

statspackをアンインストールする場合は、下記のスクリプトを実行します。

@?/rdbms/admin/spdrop

参考サイト
Oracle(12c) statspackのインストールと使い方
https://qiita.com/mkyz08/items/729545aab4751f3002d0

Oracle9i データベース チューニング ガイド
https://docs.oracle.com/cd/F25597_01/document/products/wli/docs102/dbtuning/statsApdx.html

Posted by tfurukaw