Oracle Statspackのスナップショットの取得からレポート作成、削除までの使い方【実行ログ付き】

  • URLをコピーしました!
Oracle AI Database
僕の作業環境
  • OS:Oracle Linux 9.7
  • 導入製品:Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0

Oracle Statspackは、Oracle Databaseのパフォーマンス統計を収集・分析するための無償の診断ツールです。

AWR(Automatic Workload Repository)が利用できないStandard EditionやDiagnostic Pack/Tuning Packライセンスを保有していない環境でも使えます。

本記事では、Oracle Statspackの基本的な使い方を、実機検証で取得したログとともに解説します。

この記事でわかること
  • Oracle Statspackの主要テーブルの構造とカラムの意味
  • スナップショットの手動と自動の取得方法
  • レポートの作成手順
  • Statspackパラメータの変更
目次

Oracle Statspackのインストール

Oracle Statspackの導入・インストールについては、以下の記事で解説しています。

あわせて読みたい
Oracle Statspackの導入・インストール手順【実行ログ付き】 僕の作業環境 OS:Oracle Linux 9.7 導入製品:Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 本記事では、Oracle Statspackの導入・インストール手...

Statspackの主要テーブル

Statspackをインストールすると、PERFSTATユーザの配下に多数のテーブルが作成されます。

なかでも運用で最初に押さえるべき重要な3つのテーブルが以下です。

  • stats$database_instance
  • stats$statspack_parameter
  • stats$snapshot

stats$database_instance|データベース・インスタンス情報の管理表

stats$database_instanceは、スナップショット取得時のデータベース・インスタンス情報を保持するテーブルです。

複数インスタンス・複数データベースのデータを同居できるため、各スナップショットがどの環境から取得されたかを識別する役割を担います。

また、データベース・インスタンスが起動・再起動するたびに、スナップショット時の環境が格納されます。

set pages 500
set lines 500
col dbid for 9999999999
col instance_number for 99999
col startup_time for a19
col snap_id for 99999999
col parallel for a3
col version for a17
col db_name for a10
col instance_name for a20
col host_name for a35
col platform_name for a35
SELECT * FROM stats$database_instance;

出力されるカラムは以下のとおりです。

  • DBID:データベース識別子
  • INSTANCE_NUMBER:インスタンス番号
  • STARTUP_TIME:インスタンス起動時刻
  • SNAP_ID:この起動セッションで最初に取得されたスナップショットID
  • PARALLEL:RAC構成かどうか(YES/NO)
  • VERSION:Oracleソフトウェアの実バージョン
  • DB_NAME:データベース名
  • INSTANCE_NAME:インスタンス名
  • HOST_NAME:データベースサーバのホスト名
  • PLATFORM_NAME:プラットフォーム名

stats$statspack_parameter|Statspackの動作設定を保持する管理表

stats$statspack_parameterは、Statspackの動作を制御するパラメータのデフォルト値を保持するテーブルです。

スナップショット取得時に引数なしで呼び出した際に適用される、収集レベルやSQLキャプチャの閾値などが格納されています。

set pages 500
set lines 500
col dbid for 9999999999
col instance_number for 99999
col session_id for 99999
col snap_level for 99
col num_sql for 99999
col executions_th for 99999
col parse_calls_th for 99999
col disk_reads_th for 999999
col buffer_gets_th for 9999999
col sharable_mem_th for 99999999
col version_count_th for 9999
col pin_statspack for a6
col all_init for a5
col last_modified for a19
col ucomment for a30
col job for 99999
col seg_phy_reads_th for 999999
col seg_log_reads_th for 9999999
col seg_buff_busy_th for 9999
col seg_rowlock_w_th for 9999
col seg_itl_waits_th for 9999
col seg_cr_bks_rc_th for 99999
col seg_cu_bks_rc_th for 99999
col old_sql_capture_mth for a6
SELECT * FROM stats$statspack_parameter;

出力されるカラムは以下のとおりです。

  • DBID:データベース識別子
  • INSTANCE_NUMBER:インスタンス番号
  • SESSION_ID:デフォルトセッションID(0=指定なし)
  • SNAP_LEVEL:デフォルトのスナップショットレベル
  • NUM_SQL:キャプチャする上位N件のSQL数
  • EXECUTIONS_TH:SQL実行回数のデフォルトしきい値
  • PARSE_CALLS_TH:SQLパース回数のデフォルトしきい値
  • DISK_READS_TH:SQLディスク読込のデフォルトしきい値
  • BUFFER_GETS_TH:SQLバッファ取得のデフォルトしきい値
  • SHARABLE_MEM_TH:SQL共有メモリのデフォルトしきい値
  • VERSION_COUNT_TH:SQLバージョン数のデフォルトしきい値
  • PIN_STATSPACK:共有プールにStatspackパッケージをピン留め(常駐固定)するか制御
  • ALL_INIT:スナップショット取得時の全初期化パラメータをキャプチャするか制御
  • LAST_MODIFIED:パラメータ行の最終更新日時
  • UCOMMENT:コメント
  • JOB:自動収集ジョブのDBMS_JOB番号(検証したがNULLのままで用途が不明)
  • SEG_PHY_READS_TH:特定のセグメントの物理読込回数のデフォルトしきい値
  • SEG_LOG_READS_TH:特定のセグメントの論理読込回数のデフォルトしきい値
  • SEG_BUFF_BUSY_TH:特定のセグメントの”buffer busy waits”の発生回数のデフォルトしきい値
  • SEG_ROWLOCK_W_TH:特定のセグメントの行ロック待機の発生回数のデフォルトしきい値
  • SEG_ITL_WAITS_TH:特定のセグメントのITL待機の発生回数のデフォルトしきい値
  • SEG_CR_BKS_RC_TH(RAC関連):CRブロック受信のデフォルトしきい値
  • SEG_CU_BKS_RC_TH(RAC関連):CURRENTブロック受信のデフォルトしきい値
  • OLD_SQL_CAPTURE_MTH:旧形式SQLキャプチャ方式を使うかのフラグ

スナップショットレベル(SNAP_LEVEL)の違い

SNAP_LEVELは、スナップショットで収集する情報の粒度を決めるパラメータです。

レベルが上がるほど詳細な情報を取得できる代わりに、取得時間と格納サイズが増加します。

レベル収集内容
0一般的なパフォーマンス統計のみ(SQL情報なし)
5Level 0 + 高負荷SQLの収集
6Level 5 + SQL実行計画
7Level 6 + セグメントレベル統計
10Level 7 + 親子ラッチ統計(取得負荷が高いため通常は非推奨)

SQLキャプチャ閾値の判定ロジック

スナップショット時に、EXECUTIONS_TH、PARSE_CALLS_TH、DISK_READS_TH、BUFFER_GETS_TH、SHARABLE_MEM_TH、VERSION_COUNT_THのいずれか1つでも超えたSQLがスナップショットの対象になります。

論理ORで判定されるため、閾値を厳しく(小さく)するとキャプチャされるSQL数が増え、緩く(大きく)するとキャプチャ数が絞られます。

PIN_STATSPACKの運用方針

メモリが極端に逼迫している環境以外では、デフォルトのTRUEのまま運用するのが推奨されています。

Statspackパッケージを共有プールに常駐させることで、スナップショット取得のたびに発生するパース・ロード負荷を抑えられます。

stats$snapshot|スナップショット履歴を管理する中核テーブル

stats$snapshotは、取得したスナップショットのすべての履歴を保持するテーブルです。

レポート作成時の開始/終了IDの選定、削除対象の特定、ベースライン管理など、Statspack運用の中核となるテーブルです。

日常運用ではこのテーブルを最も頻繁に挿入され、参照することになります。

set pages 500
set lines 500
col snap_id for 99999999
col dbid for 9999999999
col instance_number for 99999
col snap_time for a19
col startup_time for a19
col session_id for 99999
col serial# for 99999
col snap_level for 99
col ucomment for a30
col executions_th for 99999
col parse_calls_th for 99999
col disk_reads_th for 999999
col buffer_gets_th for 9999999
col sharable_mem_th for 99999999
col version_count_th for 9999
col seg_phy_reads_th for 999999
col seg_log_reads_th for 9999999
col seg_buff_busy_th for 9999
col seg_rowlock_w_th for 9999
col seg_itl_waits_th for 9999
col seg_cr_bks_rc_th for 99999
col seg_cu_bks_rc_th for 99999
col seg_cr_bks_sd_th for 99999
col seg_cu_bks_sd_th for 99999
col snapshot_exec_time_s for 9999.99
col all_init for a5
col baseline for a4
SELECT * FROM stats$snapshot;

出力されるカラムは以下のとおりです。

  • SNAP_ID:スナップショット識別子(自動採番)
  • DBID:データベース識別子
  • INSTANCE_NUMBER:インスタンス番号
  • SNAP_TIME:スナップショットを取得した時刻
  • STARTUP_TIME:snap取得時のインスタンス起動時刻
  • SESSION_ID:特定セッションのSID(0=指定なし)
  • SERIAL#:上記SIDのシリアル番号
  • SNAP_LEVEL:スナップショット収集レベル(0/5/6/7/10)
  • UCOMMENT:ユーザー指定コメント
  • EXECUTIONS_TH:SQL実行回数のしきい値
  • PARSE_CALLS_TH:SQLパース回数のしきい値
  • DISK_READS_TH:SQLディスク読込のしきい値
  • BUFFER_GETS_TH:SQLバッファ取得のしきい値
  • SHARABLE_MEM_TH:SQL共有メモリのしきい値
  • VERSION_COUNT_TH:SQLバージョン数のしきい値
  • SEG_PHY_READS_TH:セグメント物理読込のしきい値
  • SEG_LOG_READS_TH:セグメント論理読込のしきい値
  • SEG_BUFF_BUSY_TH:セグメントbuffer busy waitsのしきい値
  • SEG_ROWLOCK_W_TH:セグメント行ロック待機のしきい値
  • SEG_ITL_WAITS_TH:セグメントITL待機のしきい値
  • SEG_CR_BKS_RC_TH:RAC関連:CRブロック受信(Received)のしきい値
  • SEG_CU_BKS_RC_TH:RAC関連:CURRENTブロック受信のしきい値
  • SEG_CR_BKS_SD_TH:RAC関連:CRブロック提供(Served)のしきい値
  • SEG_CU_BKS_SD_TH:RAC関連:CURRENTブロック提供のしきい値
  • SNAPSHOT_EXEC_TIME_S:スナップショット取得にかかった秒数
  • ALL_INIT:全初期化パラメータ取得フラグ
  • BASELINE:ベースライン化されているか(Y/NULL)

スナップショットの取得

Statspackでのパフォーマンス分析を行う上で、スナップショットの取得です。

スナップショットとは、ある時点のV$系動的パフォーマンスビューの値を`PERFSTAT`スキーマのテーブルに保存したものを指します。

後続のレポート作成は、このスナップショットを元に行われます。

なお、Statspackインストール直後の主要管理表は何も入っていない状態で、初回のstatspack.snap実行時に各テーブルへ初期レコードが書き込まれます。

SQL> SELECT * FROM stats$database_instance;

no rows selected

SQL> SELECT * FROM stats$snapshot;

no rows selected

SQL> SELECT * FROM stats$statspack_parameter;

no rows selected

statspack.snapプロシージャを呼び出すことで、スナップショットを取得します。

所要時間は環境にもよりますが、通常は約数十秒で完了します。

SQL> EXEC statspack.snap;

PL/SQL procedure successfully completed.

stats$database_instanceは、DBID、インスタンス番号、起動時刻、初回スナップショットID、Oracleバージョン、DB名、インスタンス名、ホスト名、プラットフォーム名が記録されました。

SQL> set pages 500
SQL> set lines 500
SQL> col dbid for 9999999999
SQL> col instance_number for 99999
SQL> col startup_time for a19
SQL> col snap_id for 99999999
SQL> col parallel for a3
SQL> col version for a17
SQL> col db_name for a10
SQL> col instance_name for a20
SQL> col host_name for SQL> a35
SQL> col platform_name for a35
SQL> SELECT * FROM stats$database_instance;
       DBID INSTANCE_NUMBER STARTUP_TIME	    SNAP_ID   PAR VERSION		    DB_NAME    INSTANCE_NAME	    HOST_NAME			                PLATFORM_NAME
----------- --------------- ------------------- --------- --- ----------------- ---------- -------------------- ----------------------------------- -----------------------------------
 1756285875		          1 2026-05-03 06:27:08			1 NO  23.0.0.0.0	    ORCL	   orcl 		        learnbytebybyte		                Linux x86 64-bit

stats$statspack_parameterは、スナップショット取得時のパラメータが設定されています。

SQL> set pages 500
SQL> set lines 500
SQL> col dbid for 9999999999
SQL> col instance_number for 99999
SQL> col session_id for 99999
SQL> col snap_level for 99
SQL> col num_sql for 99999
SQL> col version_count_th for 9999
SQL> col pin_statspack for a6
SQL> col all_init for a5
SQL> col last_modified for a19
SQL> col ucomment for a30
SQL> col job for 99999
SQL> SELECT dbid,instance_number,session_id,snap_level,num_sql,pin_statspack,all_init,last_modified,ucomment,job FROM stats$statspack_parameter;

       DBID INSTANCE_NUMBER SESSION_ID SNAP_LEVEL NUM_SQL PIN_ST ALL_I LAST_MODIFIED	   UCOMMENT			     JOB
----------- --------------- ---------- ---------- ------- ------ ----- ------------------- ------------------------------ ------
 1756285875		          1	         0		    5      50 TRUE	 FALSE 2026-05-04 07:28:26

stats$snapshotは、取得したすべてのスナップショットの履歴があります。

SQL> set pages 500
SQL> set lines 500
SQL> col snap_id for 99999999
SQL> col dbid for 9999999999
SQL> col instance_number for 99999
SQL> col snap_time for a19
SQL> col startup_time for a19
SQL> col session_id for 99999
SQL> col serial# for 99999
SQL> col snap_level for 99
SQL> col ucomment for a30
SQL> col snapshot_exec_time_s for 9999.99
SQL> col all_init for a5
SQL> col baseline for a4
SQL> SELECT snap_id,dbid,instance_number,snap_time,startup_time,session_id,serial#,snap_level,ucomment,snapshot_exec_time_s,all_init,baseline FROM stats$snapshot;
  SNAP_ID	     DBID INSTANCE_NUMBER SNAP_TIME 	      STARTUP_TIME	      SESSION_ID SERIAL# SNAP_LEVEL UCOMMENT			           SNAPSHOT_EXEC_TIME_S ALL_I BASE
--------- ----------- --------------- ------------------- ------------------- ---------- ------- ---------- ------------------------------ -------------------- ----- ----
	1      1756285875		        1 2026-05-04 07:28:26 2026-05-03 06:27:08	       0       0	      5						           1.31                 FALSE

レポートの作成

Statspackレポートは、開始スナップショット終了スナップショットの差分を解析することで、その期間中の負荷状況を可視化します。

SQL> SELECT 
  2  snap_id,dbid,instance_number,snap_time,startup_time,session_id,serial#,snap_level,ucomment,snapshot_exec_time_s,all_init,baseline
  3  FROM stats$snapshot;
  SNAP_ID	     DBID INSTANCE_NUMBER SNAP_TIME 	      STARTUP_TIME	      SESSION_ID SERIAL# SNAP_LEVEL UCOMMENT			           SNAPSHOT_EXEC_TIME_S ALL_I BASE
--------- ----------- --------------- ------------------- ------------------- ---------- ------- ---------- ------------------------------ -------------------- ----- ----
	    1  1756285875		    1 2026-05-04 07:28:26     2026-05-03 06:27:08	       0       0	  5						               1.31                 FALSE
       11  1756285875		    1 2026-05-05 12:23:44     2026-05-03 06:27:08	       0       0	  5						               .71                  FALSE

レポート生成には$ORACLE_HOME/rdbms/admin/spreport.sqlを使用します。

SQL> @?/rdbms/admin/spreport

Current Instance
~~~~~~~~~~~~~~~~

   DB Id    DB Name	 Inst Num Instance
----------- ------------ -------- ------------
 1756285875 ORCL		1 orcl



Instances in this Statspack schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   DB Id    Inst Num DB Name	  Instance     Host
----------- -------- ------------ ------------ ------------
 1756285875	   1 ORCL	  orcl	       OracleRestar
					       t26ai

Using 1756285875 for database Id
Using	       1 for instance number


Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering the number of days (n) will result in the most recent
(n) days of snapshots being listed.  Pressing <return> without
specifying a number lists all completed snapshots.



Listing all Completed Snapshots

						       Snap
Instance     DB Name	    Snap Id   Snap Started    Level Comment
------------ ------------ --------- ----------------- ----- --------------------
orcl	     ORCL		  1 04 May 2026 19:28	  5
				 11 05 May 2026 00:23	  5



Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 1
Begin Snapshot Id specified: 1

Enter value for end_snap: 11
End   Snapshot Id specified: 11



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

Enter value for report_name: sp_1_11.lis

Using the report name sp_1_11.lis

STATSPACK report for

Database    DB Id    Instance	  Inst Num  Startup Time   Release     RAC
~~~~~~~~ ----------- ------------ -------- --------------- ----------- ---
	  1756285875 orcl		 1 03-May-26 06:27 23.0.0.0.0  NO

Host Name	      Platform		      CPUs Cores Sockets   Memory (G)
~~~~ ---------------- ---------------------- ----- ----- ------- ------------
     learnbytebybyte Linux x86 64-bit		 4     2       1	 15.2

Snapshot       Snap Id	   Snap Time	  Sessions Curs/Sess Comment
~~~~~~~~    ---------- ------------------ -------- --------- ------------------
Begin Snap:	     1 04-May-26 19:28:26	 1	 5.0
  End Snap:	    11 05-May-26 00:23:44	 1	 4.0
   Elapsed:	295.30 (mins) Av Act Sess:	 0.0
   DB time:	  2.00 (mins)	   DB CPU:	 1.70 (mins)

<省略>

End of Report ( sp_1_11.lis )

実行後、約195KBのレポートファイルsp_1_11.lisがカレントディレクトリに出力されました。

[oracle@learnbytebybyte ~]$ ls -la sp_*
-rw-r--r--. 1 oracle oinstall 195233 May  5 00:39 sp_1_11.lis

自動取得ジョブの設定

Statspackは、スナップショットの自動収集ジョブを設定するスクリプトが用意されています。

毎回手動でstatspack.snapを実行する必要がなく、スナップショットを1時間ごとに自動取得されます。

自動取得がないことを確認

user_jobsテーブルで、PERFSTATユーザのジョブ未設定を確認しています。

SQL> -- 自動収集ジョブがないことを確認
SQL> SELECT * FROM user_jobs;

no rows selected

SQL> 

PERFSTATユーザに権限付与

自動取得ジョブを登録する上で、PERFSTATユーザにCREATE JOB権限が必要です。

12c以降は自分自身のスキーマにジョブを作成する場合でもCREATE JOB権限が必要です。

SQL> connect / as sysdba
Connected.
SQL> alter session set container = orclpdb1;

Session altered.

SQL> grant create job to perfstat;

Grant succeeded.

自動取得スクリプトの実行

$ORACLE_HOME/rdbms/admin/spauto.sqlを実行することで、1時間ごとのスナップショット取得ジョブが登録されます。

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

PL/SQL procedure successfully completed.


Job number for automated statistics collection for this instance
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Note that this job number is needed when modifying or removing
the job:

     JOBNO
----------
	     2


Job queue process
~~~~~~~~~~~~~~~~~
Below is the current setting of the job_queue_processes init.ora
parameter - the value for this parameter must be greater
than 0 to use automatic statistics gathering:

NAME				                 TYPE
------------------------------------ -----------
VALUE
------------------------------
job_queue_processes		             integer
80


Next scheduled run
~~~~~~~~~~~~~~~~~~
The next scheduled run for this job is:

       JOB NEXT_DATE NEXT_SEC
---------- --------- --------
	     2 05-MAY-26 04:00:00

これでデフォルトの1時間ごとに自動でスナップショットが取得されるようになります。

スナップショットの削除

長期間運用するとスナップショットが蓄積し、PERFSTATユーザの表領域を圧迫します。

Statspackでは以下の3つの削除方法が提供されています。

  • statspack.purge(i_num_days=>N)・・・N日より古いスナップショットを一括削除
  • statspack.purge(i_begin_snap=>X, i_end_snap=>Y)・・・SNAP_IDの範囲で削除
  • sptrunc.sql・・・全テーブルをTRUNCATE(全削除)

スナップショットの一覧を表示

スナップショットの削除前の現状を確認します。

SQL> set pages 500
SQL> set lines 500
SQL> col snap_id for 99999999
SQL> col dbid for 9999999999
SQL> col instance_number for 99999
SQL> col snap_time for a19
SQL> col startup_time for a19
SQL> col session_id for 99999
SQL> col serial# for 99999
SQL> col snap_level for 99
SQL> col ucomment for a30
SQL> col snapshot_exec_time_s for 9999.99
SQL> col all_init for a5
SQL> col baseline for a4
SQL> SELECT snap_id,dbid,instance_number,snap_time,startup_time,session_id,serial#,snap_level,ucomment,snapshot_exec_time_s,all_init,baseline FROM stats$snapshot order by 1;

  SNAP_ID	 DBID INSTANCE_NUMBER SNAP_TIME 	  STARTUP_TIME	      SESSION_ID SERIAL# SNAP_LEVEL UCOMMENT			   SNAPSHOT_EXEC_TIME_S ALL_I BASE
--------- ----------- --------------- ------------------- ------------------- ---------- ------- ---------- ------------------------------ -------------------- ----- ----
	    1  1756285875		    1 2026-05-04 19:28:26 2026-05-03 06:27:08	       0       0	  5						   1.31 FALSE
       11  1756285875		    1 2026-05-05 00:23:44 2026-05-03 06:27:08	       0       0	  5						    .71 FALSE
       12  1756285875		    1 2026-05-05 03:37:29 2026-05-03 06:27:08	       0       0	  5						    .54 FALSE
       13  1756285875		    1 2026-05-05 03:45:33 2026-05-03 06:27:08	       0       0	  7						    .76 FALSE
       14  1756285875		    1 2026-05-05 04:00:00 2026-05-03 06:27:08	       0       0	  7						    .85 FALSE
       15  1756285875		    1 2026-05-05 05:00:00 2026-05-03 06:27:08	       0       0	  7						   1.00 FALSE
       16  1756285875		    1 2026-05-05 06:00:00 2026-05-03 06:27:08	       0       0	  7						   1.15 FALSE
       17  1756285875		    1 2026-05-05 07:00:00 2026-05-03 06:27:08	       0       0	  7						   1.31 FALSE
       18  1756285875		    1 2026-05-05 08:00:00 2026-05-03 06:27:08	       0       0	  7						   1.57 FALSE
       19  1756285875		    1 2026-05-05 09:00:00 2026-05-03 06:27:08	       0       0	  7						   1.60 FALSE
       20  1756285875		    1 2026-05-05 10:00:00 2026-05-03 06:27:08	       0       0	  7						   1.76 FALSE
       21  1756285875		    1 2026-05-05 11:00:00 2026-05-03 06:27:08	       0       0	  7						   1.94 FALSE
       22  1756285875		    1 2026-05-05 12:00:00 2026-05-03 06:27:08	       0       0	  7						   2.40 FALSE
       23  1756285875		    1 2026-05-05 13:00:00 2026-05-03 06:27:08	       0       0	  7						   2.53 FALSE
       24  1756285875		    1 2026-05-05 14:00:00 2026-05-03 06:27:08	       0       0	  7						   2.79 FALSE
       25  1756285875		    1 2026-05-05 15:00:00 2026-05-03 06:27:08	       0       0	  7						   3.13 FALSE
       26  1756285875		    1 2026-05-05 16:00:00 2026-05-03 06:27:08	       0       0	  7						   3.27 FALSE
       27  1756285875		    1 2026-05-05 17:00:00 2026-05-03 06:27:08	       0       0	  7						   3.49 FALSE
       28  1756285875		    1 2026-05-05 18:00:00 2026-05-03 06:27:08	       0       0	  7						   3.68 FALSE
       29  1756285875		    1 2026-05-05 19:00:00 2026-05-03 06:27:08	       0       0	  7						   3.95 FALSE
       30  1756285875		    1 2026-05-05 20:00:00 2026-05-05 19:57:24	       0       0	  7						   1.29 FALSE

21 rows selected.

スナップショット削除(1つ目)

statspack.purge(i_num_days=>N)は、N日より古いスナップショットがまとめて削除されます。

SQL> EXEC statspack.purge(i_num_days=>1);

PL/SQL procedure successfully completed.

1日前のスナップショット(スナップショットID:1)が削除されたことが確認できます。

SQL> SELECT snap_id,dbid,instance_number,snap_time,startup_time,session_id,serial#,snap_level,ucomment,snapshot_exec_time_s,all_init,baseline FROM stats$snapshot order by 1;

  SNAP_ID	 DBID INSTANCE_NUMBER SNAP_TIME 	  STARTUP_TIME	      SESSION_ID SERIAL# SNAP_LEVEL UCOMMENT			   SNAPSHOT_EXEC_TIME_S ALL_I BASE
--------- ----------- --------------- ------------------- ------------------- ---------- ------- ---------- ------------------------------ -------------------- ----- ----
       11  1756285875		    1 2026-05-05 00:23:44 2026-05-03 06:27:08	       0       0	  5						    .71 FALSE
       12  1756285875		    1 2026-05-05 03:37:29 2026-05-03 06:27:08	       0       0	  5						    .54 FALSE
       13  1756285875		    1 2026-05-05 03:45:33 2026-05-03 06:27:08	       0       0	  7						    .76 FALSE
       14  1756285875		    1 2026-05-05 04:00:00 2026-05-03 06:27:08	       0       0	  7						    .85 FALSE
       15  1756285875		    1 2026-05-05 05:00:00 2026-05-03 06:27:08	       0       0	  7						   1.00 FALSE
       16  1756285875		    1 2026-05-05 06:00:00 2026-05-03 06:27:08	       0       0	  7						   1.15 FALSE
       17  1756285875		    1 2026-05-05 07:00:00 2026-05-03 06:27:08	       0       0	  7						   1.31 FALSE
       18  1756285875		    1 2026-05-05 08:00:00 2026-05-03 06:27:08	       0       0	  7						   1.57 FALSE
       19  1756285875		    1 2026-05-05 09:00:00 2026-05-03 06:27:08	       0       0	  7						   1.60 FALSE
       20  1756285875		    1 2026-05-05 10:00:00 2026-05-03 06:27:08	       0       0	  7						   1.76 FALSE
       21  1756285875		    1 2026-05-05 11:00:00 2026-05-03 06:27:08	       0       0	  7						   1.94 FALSE
       22  1756285875		    1 2026-05-05 12:00:00 2026-05-03 06:27:08	       0       0	  7						   2.40 FALSE
       23  1756285875		    1 2026-05-05 13:00:00 2026-05-03 06:27:08	       0       0	  7						   2.53 FALSE
       24  1756285875		    1 2026-05-05 14:00:00 2026-05-03 06:27:08	       0       0	  7						   2.79 FALSE
       25  1756285875		    1 2026-05-05 15:00:00 2026-05-03 06:27:08	       0       0	  7						   3.13 FALSE
       26  1756285875		    1 2026-05-05 16:00:00 2026-05-03 06:27:08	       0       0	  7						   3.27 FALSE
       27  1756285875		    1 2026-05-05 17:00:00 2026-05-03 06:27:08	       0       0	  7						   3.49 FALSE
       28  1756285875		    1 2026-05-05 18:00:00 2026-05-03 06:27:08	       0       0	  7						   3.68 FALSE
       29  1756285875		    1 2026-05-05 19:00:00 2026-05-03 06:27:08	       0       0	  7						   3.95 FALSE
       30  1756285875		    1 2026-05-05 20:00:00 2026-05-05 19:57:24	       0       0	  7						   1.29 FALSE

20 rows selected.

i_num_daysは0以上と明記されているため、0の指定は意図的に拒否されます。

SQL> EXEC statspack.purge(i_num_days=>0);        
BEGIN statspack.purge(i_num_days=>0); END;

*
ERROR at line 1:
ORA-20100: Number of days specified (0) should be greater than 0
ORA-06512: at "PERFSTAT.STATSPACK", line 1387
ORA-06512: at "PERFSTAT.STATSPACK", line 1705
ORA-06512: at "PERFSTAT.STATSPACK", line 1739
ORA-06512: at line 1

スナップショット削除(2つ目)

statspack.purge(i_begin_snap=>X, i_end_snap=>Y)は、特定のSNAP_IDの範囲で削除されます。

SQL> EXEC statspack.purge(i_begin_snap=>11, i_end_snap=>13);

PL/SQL procedure successfully completed.

スナップショットID:11〜13のスナップショットが削除されたことが確認できます。

SQL> SELECT snap_id,dbid,instance_number,snap_time,startup_time,session_id,serial#,snap_level,ucomment,snapshot_exec_time_s,all_init,baseline FROM stats$snapshot order by 1;

  SNAP_ID	 DBID INSTANCE_NUMBER SNAP_TIME 	  STARTUP_TIME	      SESSION_ID SERIAL# SNAP_LEVEL UCOMMENT			   SNAPSHOT_EXEC_TIME_S ALL_I BASE
--------- ----------- --------------- ------------------- ------------------- ---------- ------- ---------- ------------------------------ -------------------- ----- ----
       14  1756285875		    1 2026-05-05 04:00:00 2026-05-03 06:27:08	       0       0	  7						    .85 FALSE
       15  1756285875		    1 2026-05-05 05:00:00 2026-05-03 06:27:08	       0       0	  7						   1.00 FALSE
       16  1756285875		    1 2026-05-05 06:00:00 2026-05-03 06:27:08	       0       0	  7						   1.15 FALSE
       17  1756285875		    1 2026-05-05 07:00:00 2026-05-03 06:27:08	       0       0	  7						   1.31 FALSE
       18  1756285875		    1 2026-05-05 08:00:00 2026-05-03 06:27:08	       0       0	  7						   1.57 FALSE
       19  1756285875		    1 2026-05-05 09:00:00 2026-05-03 06:27:08	       0       0	  7						   1.60 FALSE
       20  1756285875		    1 2026-05-05 10:00:00 2026-05-03 06:27:08	       0       0	  7						   1.76 FALSE
       21  1756285875		    1 2026-05-05 11:00:00 2026-05-03 06:27:08	       0       0	  7						   1.94 FALSE
       22  1756285875		    1 2026-05-05 12:00:00 2026-05-03 06:27:08	       0       0	  7						   2.40 FALSE
       23  1756285875		    1 2026-05-05 13:00:00 2026-05-03 06:27:08	       0       0	  7						   2.53 FALSE
       24  1756285875		    1 2026-05-05 14:00:00 2026-05-03 06:27:08	       0       0	  7						   2.79 FALSE
       25  1756285875		    1 2026-05-05 15:00:00 2026-05-03 06:27:08	       0       0	  7						   3.13 FALSE
       26  1756285875		    1 2026-05-05 16:00:00 2026-05-03 06:27:08	       0       0	  7						   3.27 FALSE
       27  1756285875		    1 2026-05-05 17:00:00 2026-05-03 06:27:08	       0       0	  7						   3.49 FALSE
       28  1756285875		    1 2026-05-05 18:00:00 2026-05-03 06:27:08	       0       0	  7						   3.68 FALSE
       29  1756285875		    1 2026-05-05 19:00:00 2026-05-03 06:27:08	       0       0	  7						   3.95 FALSE
       30  1756285875		    1 2026-05-05 20:00:00 2026-05-05 19:57:24	       0       0	  7						   1.29 FALSE

17 rows selected.

スナップショット削除(3つ目)

sptrunc.sqlは、全部のスナップショットをまとめてTRUNCATE(全削除)されます。

取得済みのスナップショットだけでなく、stats$database_instanceも含めて全削除されます。

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>


Enter value for begin_or_exit: 
Entered at the 'begin_or_exit'

... Starting truncate operation

Table truncated.


<省略>

17 rows deleted.


2 rows deleted.


Commit complete.


Package altered.

stats$statspack_parameterのスナップショット取得時のパラメータ設定は残ったままになります。

SQL> SELECT * FROM stats$database_instance;

no rows selected

SQL> SELECT dbid,instance_number,session_id,snap_level,num_sql,pin_statspack,all_init,last_modified,ucomment,job FROM stats$statspack_parameter;
       DBID INSTANCE_NUMBER SESSION_ID SNAP_LEVEL    NUM_SQL PIN_STATSP ALL_I LAST_MODIFIED	  UCOMMENT				JOB
----------- --------------- ---------- ---------- ---------- ---------- ----- ------------------- ------------------------------ ----------
 1756285875		  1	     0		7	  50 TRUE	FALSE 2026-05-04 19:28:26

1 row selected.

SQL> SELECT snap_id,dbid,instance_number,snap_time,startup_time,session_id,serial#,snap_level,ucomment,snapshot_exec_time_s,all_init,baseline FROM stats$snapshot;

no rows selected

ベースラインの管理

ベースラインは、statspack.purgeの削除操作から保護したいスナップショットにマークを付ける機能です。

性能が安定していた時期のスナップショットをベースラインとして長期保管し、後の問題発生時に比較対象として活用するのが代表的な使い方です。

下記は検証用に7件のスナップショットを取得した状態です。

SQL> SELECT snap_id,dbid,instance_number,snap_time,startup_time,session_id,serial#,snap_level,ucomment,snapshot_exec_time_s,all_init,baseline FROM stats$snapshot order by 1;

  SNAP_ID	 DBID INSTANCE_NUMBER SNAP_TIME 	  STARTUP_TIME	      SESSION_ID SERIAL# SNAP_LEVEL UCOMMENT			   SNAPSHOT_EXEC_TIME_S ALL_I BASE
--------- ----------- --------------- ------------------- ------------------- ---------- ------- ---------- ------------------------------ -------------------- ----- ----
       34  1756285875		    1 2026-05-05 20:32:03 2026-05-05 19:57:24	       0       0	  7						    .65 FALSE
       35  1756285875		    1 2026-05-05 20:32:09 2026-05-05 19:57:24	       0       0	  7						    .34 FALSE
       36  1756285875		    1 2026-05-05 20:32:10 2026-05-05 19:57:24	       0       0	  7						    .39 FALSE
       37  1756285875		    1 2026-05-05 20:32:12 2026-05-05 19:57:24	       0       0	  7						    .42 FALSE
       38  1756285875		    1 2026-05-05 20:32:13 2026-05-05 19:57:24	       0       0	  7						    .46 FALSE
       39  1756285875		    1 2026-05-05 20:32:14 2026-05-05 19:57:24	       0       0	  7						    .49 FALSE
       40  1756285875		    1 2026-05-05 20:32:15 2026-05-05 19:57:24	       0       0	  7						    .53 FALSE

7 rows selected.

ベースラインの設定

statspack.make_baseline(X,Y)は、スナップショットIDのX〜Yをベースライン化します。

実際に、スナップショットID:37と38のBASE列がYに変化しました。

SQL> EXEC statspack.make_baseline(37,38);

PL/SQL procedure successfully completed.

SQL> SELECT snap_id,dbid,instance_number,snap_time,startup_time,session_id,serial#,snap_level,ucomment,snapshot_exec_time_s,all_init,baseline FROM stats$snapshot order by 1;

  SNAP_ID	 DBID INSTANCE_NUMBER SNAP_TIME 	  STARTUP_TIME	      SESSION_ID SERIAL# SNAP_LEVEL UCOMMENT			   SNAPSHOT_EXEC_TIME_S ALL_I BASE
--------- ----------- --------------- ------------------- ------------------- ---------- ------- ---------- ------------------------------ -------------------- ----- ----
       34  1756285875		    1 2026-05-05 20:32:03 2026-05-05 19:57:24	       0       0	  7						    .65 FALSE
       35  1756285875		    1 2026-05-05 20:32:09 2026-05-05 19:57:24	       0       0	  7						    .34 FALSE
       36  1756285875		    1 2026-05-05 20:32:10 2026-05-05 19:57:24	       0       0	  7						    .39 FALSE
       37  1756285875		    1 2026-05-05 20:32:12 2026-05-05 19:57:24	       0       0	  7						    .42 FALSE Y
       38  1756285875		    1 2026-05-05 20:32:13 2026-05-05 19:57:24	       0       0	  7						    .46 FALSE Y
       39  1756285875		    1 2026-05-05 20:32:14 2026-05-05 19:57:24	       0       0	  7						    .49 FALSE
       40  1756285875		    1 2026-05-05 20:32:15 2026-05-05 19:57:24	       0       0	  7						    .53 FALSE

7 rows selected.

スナップショット削除

ベースライン化したスナップショットを含む範囲をpurgeしてみます。

SQL> EXEC statspack.purge(i_begin_snap=>34, i_end_snap=>39);

PL/SQL procedure successfully completed.

34〜39の範囲を削除指定したにもかかわらず、ベースライン化されている37, 38は保護されたまま残っています。

SQL> SELECT snap_id,dbid,instance_number,snap_time,startup_time,session_id,serial#,snap_level,ucomment,snapshot_exec_time_s,all_init,baseline FROM stats$snapshot order by 1;

  SNAP_ID	 DBID INSTANCE_NUMBER SNAP_TIME 	  STARTUP_TIME	      SESSION_ID SERIAL# SNAP_LEVEL UCOMMENT			   SNAPSHOT_EXEC_TIME_S ALL_I BASE
--------- ----------- --------------- ------------------- ------------------- ---------- ------- ---------- ------------------------------ -------------------- ----- ----
       37  1756285875		    1 2026-05-05 20:32:12 2026-05-05 19:57:24	       0       0	  7						    .42 FALSE Y
       38  1756285875		    1 2026-05-05 20:32:13 2026-05-05 19:57:24	       0       0	  7						    .46 FALSE Y
       40  1756285875		    1 2026-05-05 20:32:15 2026-05-05 19:57:24	       0       0	  7						    .53 FALSE

3 rows selected.

ベースラインの解除

ベースラインの保護を解除するにはstatspack.clear_baseline(X,Y)を使用します。

SQL> EXEC statspack.clear_baseline(37,38);

PL/SQL procedure successfully completed.

SQL> SELECT snap_id,dbid,instance_number,snap_time,startup_time,session_id,serial#,snap_level,ucomment,snapshot_exec_time_s,all_init,baseline FROM stats$snapshot order by 1;

  SNAP_ID	 DBID INSTANCE_NUMBER SNAP_TIME 	  STARTUP_TIME	      SESSION_ID SERIAL# SNAP_LEVEL UCOMMENT			   SNAPSHOT_EXEC_TIME_S ALL_I BASE
--------- ----------- --------------- ------------------- ------------------- ---------- ------- ---------- ------------------------------ -------------------- ----- ----
       37  1756285875		    1 2026-05-05 20:32:12 2026-05-05 19:57:24	       0       0	  7						    .42 FALSE
       38  1756285875		    1 2026-05-05 20:32:13 2026-05-05 19:57:24	       0       0	  7						    .46 FALSE
       40  1756285875		    1 2026-05-05 20:32:15 2026-05-05 19:57:24	       0       0	  7						    .53 FALSE

3 rows selected.

BASE列が空に戻り、通常通り削除可能なスナップショットになりました。

パラメータの変更

スナップショットのデフォルト動作に関するパラメータ(スナップショットレベル、SQLキャプチャ閾値など)は、statspack.modify_statspack_parameterプロシージャで変更できます。

ここでは例として、スナップショットレベルを5(デフォルト)から7(セグメント統計を含む)に変更しました。

SQL> SELECT dbid,instance_number,session_id,snap_level,num_sql,pin_statspack,all_init,last_modified,ucomment,job FROM stats$statspack_parameter;

       DBID INSTANCE_NUMBER SESSION_ID SNAP_LEVEL    NUM_SQL PIN_STATSP ALL_I LAST_MODI UCOMMENT			      JOB
----------- --------------- ---------- ---------- ---------- ---------- ----- --------- ------------------------------ ----------
 1756285875		          1	         0		    5	      50 TRUE	    FALSE 04-MAY-26

SQL> EXECUTE statspack.modify_statspack_parameter(i_snap_level=>7);        

PL/SQL procedure successfully completed.

SQL> SELECT dbid,instance_number,session_id,snap_level,num_sql,pin_statspack,all_init,last_modified,ucomment,job FROM stats$statspack_parameter;

       DBID INSTANCE_NUMBER SESSION_ID SNAP_LEVEL    NUM_SQL PIN_STATSP ALL_I LAST_MODI UCOMMENT			      JOB
----------- --------------- ---------- ---------- ---------- ---------- ----- --------- ------------------------------ ----------
 1756285875		           1	     0			7	  	   50 TRUE		FALSE 04-MAY-26

実際に新しいスナップショット(スナップショットID:13)を取得し、SNAP_LEVEL=7で記録されていました。

SQL> EXEC statspack.snap;

PL/SQL procedure successfully completed.

SQL> SELECT snap_id,dbid,instance_number,snap_time,startup_time,session_id,serial#,snap_level,ucomment,snapshot_exec_time_s,all_init,baseline FROM stats$snapshot order by 1;

  SNAP_ID	 DBID INSTANCE_NUMBER SNAP_TIME 	  STARTUP_TIME	      SESSION_ID SERIAL# SNAP_LEVEL UCOMMENT			   SNAPSHOT_EXEC_TIME_S ALL_I BASE
--------- ----------- --------------- ------------------- ------------------- ---------- ------- ---------- ------------------------------ -------------------- ----- ----
	1  1756285875		    1 04-MAY-26 	  03-MAY-26		       0       0	  5						   1.31 FALSE
       11  1756285875		    1 05-MAY-26 	  03-MAY-26		       0       0	  5						    .71 FALSE
       12  1756285875		    1 05-MAY-26 	  03-MAY-26		       0       0	  5						    .54 FALSE
       13  1756285875		    1 05-MAY-26 	  03-MAY-26		       0       0	  7						    .76 FALSE

まとめ

本記事では、Statspackの基本操作を、検証ログとともに以下の流れでまとめました。

  • Statspackの主要テーブル
  • スナップショットの取得
  • レポートの作成
  • 自動取得ジョブの設定
  • スナップショットの削除
  • ベースラインの管理
  • パラメータの変更

Statspackは追加ライセンス不要で利用できる貴重なパフォーマンス診断ツールです。

Standard EditionとEnterprise Editionのエディション制限がなく、Diagnostic Pack/Tuning Packライセンスを保有していなくても活用できます。

本手順を参考にぜひ活用してみてください。

最後までご愛読ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Fラン卒・未経験からデータベースエンジニアに転身。
使用技術:Oracle製品
資格取得:情報処理安全確保支援士試験|応用情報技術者試験|OracleMaster Gold DBA|OCI Architect Associate

目次