
- 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の導入・インストールについては、以下の記事で解説しています。

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情報なし) |
| 5 | Level 0 + 高負荷SQLの収集 |
| 6 | Level 5 + SQL実行計画 |
| 7 | Level 6 + セグメントレベル統計 |
| 10 | Level 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のまま運用するのが推奨されています。
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 selectedstatspack.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-bitstats$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:26stats$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は、スナップショットの自動収集ジョブを設定するスクリプトが用意されています。
自動取得がないことを確認
user_jobsテーブルで、PERFSTATユーザのジョブ未設定を確認しています。
SQL> -- 自動収集ジョブがないことを確認
SQL> SELECT * FROM user_jobs;
no rows selected
SQL> PERFSTATユーザに権限付与
自動取得ジョブを登録する上で、PERFSTATユーザに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.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(全削除)されます。
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.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は追加ライセンス不要で利用できる貴重なパフォーマンス診断ツールです。
本手順を参考にぜひ活用してみてください。
最後までご愛読ありがとうございました。
