背景・目的
Oracle のStatspackを使う機会があったので、あらためてインストールからレポートの作成まで試してみます。
まとめ
| 特徴 | 説明 |
|---|---|
| Statspack | Oracle9i DBの配布キットっとともに提供するパフォーマンスチューニングキット Statspackは、Statistics Packageの略 パフォーマンスチューニングに役立つ情報をレポートと形式で提供する |
| レポート | 特定の累積統計情報間の差分を抽出する |
| スナップショット | ある時点に収集されたパフォーマンス統計データの集合 これらの情報は、内部表(V$ビュー)から取得される |
| スナップショットのレベル | level0からlevel10まである |
| DBCA | Database Configuration Assistant Oracleデータベースを作成・設定するツール 機能は下記のようなものがある ・データベース作成 ・データベース削除 ・テンプレート管理 ・データベース設定変更 |
| スナップショットの取得期間 | スナップショットの間隔は30分から1時間で常時取得するのが良い |
| スナップショット取得時の負荷について | インストールしたのみで、サーバの負荷に影響を与えることはない スナップショットの取得も、通常はそれほど負荷がかかることはない スナップショット取得時には、内部表(V$ビュー)から情報を取得する |
| SYSDBA | System Database Administrator(システムデータベース管理者) Oracleの最高権限ロール SYSDBAでできること ・ データベース起動/停止 (STARTUP/SHUTDOWN) ・データベース作成/削除 ・バックアップ/リカバリ ・アーカイブログモード変更 ・全てのデータアクセス ・システムパラメータ変更 接続できるユーザー ・SYSユーザー(デフォルト) ・dbaグループのOSユーザー(今回はoracleユーザー) |
| Oracleの権限レベル | SYSDBA (最高) ↓ SYSOPER (運用管理) ↓ DBA (通常管理者) ↓ 一般ユーザー |
| Oracleインストール時に必要なパッケージ(EC2) | ・binutils:リンカー、アセンブラなどのバイナリツール ・gcc:Cコンパイラ (Oracleの一部コンポーネントのコンパイルに必要) ・glibc / glibc-devel: GNU C標準ライブラリ ・ksh:Kornシェル (Oracleのスクリプトで使用) ・libaio / libaio-devel:非同期I/Oライブラリ (Oracleの高速I/O処理に必須) ・libgcc / libstdc++;GCCランタイムライブラリ、C++標準ライブラリ ・make:ビルドツール ・sysstat:システムパフォーマンス監視ツール ・unzip:Oracleインストーラーの解凍に必要 |
| Oracleのグループ | - oinstall:Oracle Inventory グループ ・Oracleソフトウェアの所有者グループ ・インストールディレクトリ (/u01/app/oracle) の管理権限 - dba:Database Administrator グループ ・データベース管理者権限 ・SYSDBA権限でのデータベース操作が可能 |
概要
Statspackとは
下記のドキュメントを基に整理します。
Statspack は、Oracle 社が Oracle9i データベースの配布キットと共に提供するパフォーマンス チューニング キットです。Statspack は、わずかな操作で任意の Oracle9i データベースにインストール可能で、そのデータベース インスタンスのパフォーマンスに関する詳細な分析データをすばやく収集します。
- Statspackは、Oracle9i DBの配布キットっとともに提供するパフォーマンスチューニングキット
-
Statspackは、Statistics Packageの略
-
パフォーマンスチューニングに役立つ情報をレポートと形式で提供する
-
Statspackを利用すると、ある期間で行われた処理の統計情報を取得可能
-
下記のようなものが取得し、性能劣化の原因を分析可能
- トランザクションの傾向
- メモリのヒット率
- DBの待機状況
-
ある時点の累積統計情報を取得する(スナップショットという)(1)
-
その後のある時点(2)で取得した内部統計データの差分(1と2の差分)を基に、その間のパフォーマンス統計を結果レポートに出力する
スナップショットとは
- ある時点に収集されたパフォーマンス統計データの集合
- これらの情報は、内部表(V$ビュー)から取得される
- 取得される情報は、スナップショットのレベルによって異なる
- パフォーマンス・クリニックでは、「Level5 (デフォルト値) 」のスナップショットを取得する
| レベル | 基本統計 | アドバイス | SQL統計 | SQL詳細 | セグメント統計 | ラッチ統計 |
|---|---|---|---|---|---|---|
| level0 | ◯ | ◯ | ||||
| level5 | ◯ | ◯ | ◯ | |||
| level6 | ◯ | ◯ | ◯ | ◯ | ||
| level7 | ◯ | ◯ | ◯ | ◯ | ◯ | |
| level10 | ◯ | ◯ | ◯ | ◯ | ◯ | ◯ |
スナップショットの取得期間
- スナップショットの間隔は30分から1時間で常時取得するのが良い
- 長すぎると、統計データが平均化され、問題の特定が難しい
- 保存期間を決めて、古くなったものは定期的に削除する
スナップショット取得時の負荷について
- Statspackの実態はプロシージャと実行スクリプト
- インストールしたのみで、サーバの負荷に影響を与えることはない
- スナップショットの取得も、通常はそれほど負荷がかかることはない
- Level10のスナップショットでは負荷がかかる可能性がある
- スナップショット取得時には、内部表(V$ビュー)から情報を取得する
- この際、主にCPUリソースを使用するため、
- CPU負荷の高い時間を避けるなどの工夫が必要
- 高負荷な時間を挟んで取得
- レポートの作成は負荷が低い時に実行
インストール前の確認
インストール済みの確認
-
既にStatspackがインストールされているかどうかの確認は、以下の方法で「PERFSTAT」ユーザーが存在しているか確認可能。存在する場合は既にインストールがされている
SELECT user_id, username FROM dba_users WHERE username = ‘PERFSTAT’;
表領域の作成
- Statspack情報格納用の表領域を作成
- 管理上の理由から、ユーザーデータと分離することを推奨
- 既存の表領域を使う場合、SYSTEM表領域を指定しないことSYSTEM表領域を指定すると、インストールエラーになる
- Statspackをインストールするには、最低約64MBが必要
- スナップショット保存用に必要な領域のサイズは、スナップショットの回数、データベースの処理量などによって異なる。まずは300MB~500MB程度を用意
Statspackのメンテナンス
不要になったスナップショットの削除
- インストール時に作成済みのsppurge.sqlスクリプトを実行
Statspackのアンインストール
- ORACLE_HOME/rdbms/admin/spdrop.sqlを実行
Oracle Technology Networkライセンス契約
Oracle Technology Networkライセンスを確認します。
要約すると下記の通りでした。今回の用途としては、検証(テスト)なので問題ありません
許可される用途(無料)
- 開発
- テスト
- プロトタイプ作成
- デモンストレーション
条件: アプリケーションがデータ処理、業務、商用、本番利用されていない限り
禁止事項
- 本番環境での使用
- データ処理、業務、商用目的での使用
- 第三者への教育目的での使用
- 再配布・譲渡
- リバースエンジニアリング(相互運用性検証目的で法律で認められている場合を除く)
- Oracleの事前承諾なしのベンチマーク結果開示
ライセンス条件
- 非独占的、譲渡不能の限定ライセンス
- 内部使用のみ
- 委託業者/請負業者も使用可能(お客様の責任下)
- バックアップコピー1部のみ作成可
保証・サポート
- 保証なし(現状有姿のまま提供)
- テクニカルサポートなし
- 損害賠償責任上限: 1000米ドル
終了
- 違反時は自動終了
- 全複製物破棄で任意終了可能
準拠法
- 米国カリフォルニア州法
- カリフォルニア州サンフランシスコ又はサンタクララの裁判所が専属管轄
実践
下記の環境で試します。
前提
バージョン
- Amazon Linux2を利用します(Amazon Linux2023 のJava環境と、Oracle11gのインストーラーと互換性がありませんでした)
環境
- NWを構築します
- S3バケットを構築します
Oracle Database 11 Standard Editionのダウンロード
-
下記のファイルをダウンロードします
- linux.x64_11gR2_database_1of2.zip (1,239,269,270 bytes) (cksum - 3152418844)
- linux.x64_11gR2_database_2of2.zip (1,111,416,131 bytes) (cksum - 3669256139)
S3にアップロード
- 上記のファイルをS3にアップロードします
EC2をデプロイ
-
EC2をDBサブネットにデプロイします
-
ユーザを作成します
-
Oracleに必要なパッケージをインストールします
yum install -y binutils gcc glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ make sysstat unzip- binutils - リンカー、アセンブラなどのバイナリツール
- gcc - Cコンパイラ (Oracleの一部コンポーネントのコンパイルに必要)
- glibc / glibc-devel - GNU C標準ライブラリ
- ksh - Kornシェル (Oracleのスクリプトで使用)
- libaio / libaio-devel - 非同期I/Oライブラリ (Oracleの高速I/O処理に必須)
- libgcc / libstdc++ - GCCランタイムライブラリ、C++標準ライブラリ
- make - ビルドツール
- sysstat - システムパフォーマンス監視ツール
- unzip - Oracleインストーラーの解凍に必要
-
dbaとoinstallグループを追加します
groupadd -g 54321 oinstall groupadd -g 54322 dba -
oracleユーザを作成します
useradd -u 54321 -g oinstall -G dba oracle
Oracleをインストール
スワップ領域を作成
-
rootにスイッチします
$ sudo su - # -
スワップファイル作成します(2GBの空ファイルを作成する)
# dd if=/dev/zero of=/swapfile bs=1M count=2048 2048+0 records in 2048+0 records out 2147483648 bytes (2.1 GB, 2.0 GiB) copied, 5.29389 s, 406 MB/s # -
パーミッションをつけます(rootのみ読み書き可能)
# chmod 600 /swapfile # ls -l /swapfile -rw-------. 1 root root 2147483648 Jan 14 09:00 /swapfile # -
ファイルをスワップ領域としてフォーマットする
# mkswap /swapfile Setting up swapspace version 1, size = 2 GiB (2147479552 bytes) no label, UUID=XXXXX-XXXX-XXXX-XXXX-XXXXXX # -
スワップ領域を有効化します。(これで即座に使用可能となる)
swapon /swapfile -
確認します。スワップが2GBになりました
# free -h total used free shared buff/cache available Mem: 7.6Gi 197Mi 352Mi 0.0Ki 7.1Gi 7.2Gi Swap: 2.0Gi 0B 2.0Gi # -
再起動後も有効化できるようにします
# echo '/swapfile none swap sw 0 0' >> /etc/fstab # cat /etc/fstab # UUID=XXXXX-XXXXX-XXXXX-XXXXX-XXXXX / xfs defaults,noatime 1 1 UUID=XXXXX-XXXXX /boot/efi vfat defaults,noatime,uid=0,gid=0,umask=0077,shortname=winnt,x-systemd.automount 0 2 /swapfile none swap sw 0 0 #
スイッチユーザ
- Oracleのインストールと実行はoracleユーザーで行う必要があるためスイッチします
- Oracleソフトウェアは専用ユーザーでインストールするのがベストプラクティスとのこと
- SSMでEC2に接続します
- oracleユーザにスイッチします
$ whoami ssm-user $ sudo su - oracle $ $ cd $ pwd /home/oracle $
S3からインストーラーをダウンロード
- S3に配置したインストーラーをダウンロードします
$ aws s3 cp s3://XXXXXX/linux.x64_11gR2_database_1of2.zip . download: s3://XXXXXX/linux.x64_11gR2_database_1of2.zip to ./linux.x64_11gR2_database_1of2.zip $ aws s3 cp s3://XXXXXX/linux.x64_11gR2_database_2of2.zip . download: s3://XXXXXX/linux.x64_11gR2_database_2of2.zip to ./linux.x64_11gR2_database_2of2.zip $ ls -lh *.zip -rw-r--r--. 1 oracle oinstall 1.2G Jan 14 08:25 linux.x64_11gR2_database_1of2.zip -rw-r--r--. 1 oracle oinstall 1.1G Jan 14 08:26 linux.x64_11gR2_database_2of2.zip $ - ダウンロードしたzipを解凍します
unzip linux.x64_11gR2_database_1of2.zip unzip linux.x64_11gR2_database_2of2.zip - 解凍後、databaseディレクトリが作成されました
$ ls -l total 2295604 -rw-r--r--. 1 oracle oinstall 654 Jan 14 08:34 README.txt drwxr-xr-x. 8 oracle oinstall 128 Aug 20 2009 database -rw-r--r--. 1 oracle oinstall 1239269270 Jan 14 08:25 linux.x64_11gR2_database_1of2.zip -rw-r--r--. 1 oracle oinstall 1111416131 Jan 14 08:26 linux.x64_11gR2_database_2of2.zip $
レスポンスファイルを作成
レスポンスファイルとは
- Oracleインストーラーをサイレントモード(GUI不要)で実行するための設定ファイル
- サイレントインストール
- レスポンスファイルに答えを事前記載
- コマンドラインで自動実行
- SSHのみで完結
- 主な設定内容
- INSTALL_DB_SWONLY = ソフトウェアのみインストール(DB作成は後で)
- InstallEdition=SE = Standard Edition
- ORACLE_HOME = インストール先
- DECLINE_SECURITY_UPDATES=true = Oracle更新通知なし
- EC2のようなCLI環境では必須の方法
- レスポンスファイルを作成します
$ cat > /home/oracle/db_install.rsp <<'EOF' oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0 oracle.install.option=INSTALL_DB_SWONLY ORACLE_HOSTNAME=localhost UNIX_GROUP_NAME=oinstall INVENTORY_LOCATION=/u01/app/oraInventory SELECTED_LANGUAGES=en,ja ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 ORACLE_BASE=/u01/app/oracle oracle.install.db.InstallEdition=SE oracle.install.db.DBA_GROUP=dba oracle.install.db.OPER_GROUP=dba DECLINE_SECURITY_UPDATES=true EOF $ ls -l db_install.rsp -rw-r--r--. 1 oracle oinstall 460 Jan 14 08:54 db_install.rsp $ - 確認します
$ cat db_install.rsp oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0 oracle.install.option=INSTALL_DB_SWONLY ORACLE_HOSTNAME=localhost UNIX_GROUP_NAME=oinstall INVENTORY_LOCATION=/u01/app/oraInventory SELECTED_LANGUAGES=en,ja ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 ORACLE_BASE=/u01/app/oracle oracle.install.db.InstallEdition=SE oracle.install.db.DBA_GROUP=dba oracle.install.db.OPER_GROUP=dba DECLINE_SECURITY_UPDATES=true $
Oracleのインストール
1つ目のターミナル
- databaseディレクトリに移動します
$ cd database - インストールコマンドを実行します。はじまりました
$ ls -l runInstaller -rwxr-xr-x. 1 oracle oinstall 3226 Aug 15 2009 runInstaller $ $ ./runInstaller -silent -responseFile /home/oracle/db_install.rsp -ignorePrereq Starting Oracle Universal Installer... Checking Temp space: must be greater than 120 MB. Actual 93809 MB Passed Checking swap space: must be greater than 150 MB. Actual 2047 MB Passed Preparing to launch Oracle Universal Installer from /tmp/OraInstall2026-01-14_09-21-26AM. Please wait ...$ You can find the log of this install session at: /u01/app/oraInventory/logs/installActions2026-01-14_09-21-26AM.log - しばらくすると、下記のように表示されました
$ ./runInstaller -silent -responseFile /home/oracle/db_install.rsp -ignorePrereq Starting Oracle Universal Installer... Checking Temp space: must be greater than 120 MB. Actual 93809 MB Passed Checking swap space: must be greater than 150 MB. Actual 2047 MB Passed Preparing to launch Oracle Universal Installer from /tmp/OraInstall2026-01-14_09-21-26AM. Please wait ...$ You can find the log of this install session at: /u01/app/oraInventory/logs/installActions2026-01-14_09-21-26AM.log The following configuration scripts need to be executed as the "root" user. #!/bin/sh #Root scripts to run /u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/dbhome_1/root.sh To execute the configuration scripts: 1. Open a terminal window 2. Log in as "root" 3. Run the scripts 4. Return to this window and hit "Enter" key to continue Successfully Setup Software.
2つ目のターミナル
-
別ターミナルを起動します
-
oracleユーザに切り替えます
$ sudo su - oracle Last login: Wed Jan 14 09:19:19 UTC 2026 on pts/0 $ -
ログを確認します
$ tail -f /u01/app/oraInventory/logs/installActions2026-01-14_09-21-26AM.log INFO: Validating state <finish> WARNING: Validation disabled for the state finish INFO: Completed validating state <finish> INFO: Terminating all background operations INFO: Terminated all background operations INFO: Successfully executed the flow in SILENT mode INFO: Finding the most appropriate exit status for the current application INFO: Exit Status is 0 INFO: Shutdown Oracle Database 11g Release 2 Installer INFO: Unloading Setup Driver -
oracleからexitします
-
rootになります
$ sudo su - Last login: Wed Jan 14 09:17:20 UTC 2026 on pts/0 # -
1つ目のスクリプトを実行します
# /u01/app/oraInventory/orainstRoot.sh Changing permissions of /u01/app/oraInventory. Adding read,write permissions for group. Removing read,write,execute permissions for world. Changing groupname of /u01/app/oraInventory to oinstall. The execution of the script is complete. # -
2つ目のスクリプトを実行します
# /u01/app/oracle/product/11.2.0/dbhome_1/root.sh Check /u01/app/oracle/product/11.2.0/dbhome_1/install/root_ip-10-1-3-149.ap-northeast-1.compute.internal_2026-01-14_09-30-59.log for the output of root script #
1つ目のターミナル
- 上記のスクリプトが完了したら、Enterを押します
$ ./runInstaller -silent -responseFile /home/oracle/db_install.rsp -ignorePrereq Starting Oracle Universal Installer... Checking Temp space: must be greater than 120 MB. Actual 93809 MB Passed Checking swap space: must be greater than 150 MB. Actual 2047 MB Passed Preparing to launch Oracle Universal Installer from /tmp/OraInstall2026-01-14_09-21-26AM. Please wait ...$ You can find the log of this install session at: /u01/app/oraInventory/logs/installActions2026-01-14_09-21-26AM.log The following configuration scripts need to be executed as the "root" user. #!/bin/sh #Root scripts to run /u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/dbhome_1/root.sh To execute the configuration scripts: 1. Open a terminal window 2. Log in as "root" 3. Run the scripts 4. Return to this window and hit "Enter" key to continue Successfully Setup Software. <Enter>を押す $
データベース作成
環境変数の作成
-
環境変数を作成します
$ cat >> ~/.bash_profile <<'EOF' > export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 > export ORACLE_SID=ORCL > export PATH=$ORACLE_HOME/bin:$PATH > EOF $ -
bash_profileを読み込みます
$ source ~/.bash_profile $ echo $ORACLE_HOME /u01/app/oracle/product/11.2.0/dbhome_1 $ -
sqlplus が確認できるか確認します(パスが通っているか)
$ which sqlplus /u01/app/oracle/product/11.2.0/dbhome_1/bin/sqlplus $
データベース作成用のレスポンスファイルを作成
-
レスポンスファイルを作成します
$ cat > /home/oracle/dbca.rsp <<'EOF' > [GENERAL] > RESPONSEFILE_VERSION = "11.2.0" > OPERATION_TYPE = "createDatabase" > > [CREATEDATABASE] > GDBNAME = "ORCL" > SID = "ORCL" > TEMPLATENAME = "General_Purpose.dbc" > SYSPASSWORD = "XXXXX" > SYSTEMPASSWORD = "XXXXX" > SYSMANPASSWORD = "XXXXX" > DBSNMPPASSWORD = "XXXXX" > DATAFILEDESTINATION = "/u01/app/oracle/oradata" > RECOVERYAREADESTINATION = "/u01/app/oracle/flash_recovery_area" > STORAGETYPE = FS > CHARACTERSET = "AL32UTF8" > NATIONALCHARACTERSET = "AL16UTF16" > MEMORYPERCENTAGE = "40" > TOTALMEMORY = "2048" > EOF $ -
確認します
$ cat dbca.rsp [GENERAL] RESPONSEFILE_VERSION = "11.2.0" OPERATION_TYPE = "createDatabase" [CREATEDATABASE] GDBNAME = "ORCL" SID = "ORCL" TEMPLATENAME = "General_Purpose.dbc" SYSPASSWORD = "XXXXX" SYSTEMPASSWORD = "XXXXX" SYSMANPASSWORD = "XXXXX" DBSNMPPASSWORD = "XXXXX" DATAFILEDESTINATION = "/u01/app/oracle/oradata" RECOVERYAREADESTINATION = "/u01/app/oracle/flash_recovery_area" STORAGETYPE = FS CHARACTERSET = "AL32UTF8" NATIONALCHARACTERSET = "AL16UTF16" MEMORYPERCENTAGE = "40" TOTALMEMORY = "2048" $
データベースを作成
-
現在の状態を確認します
$ ps -ef | grep pmon oracle 2462 2369 0 11:16 pts/0 00:00:00 grep --color=auto pmon $ ls -l /u01/app/oracle/ total 0 drwxr-xr-x 2 oracle oinstall 6 Jan 14 09:24 checkpoints drwxrwxr-x 3 oracle oinstall 20 Jan 14 09:13 product $ -
実行します。動き始めましたレスポンスファイルの設定に従い、下記を行いインスタンス起動まで行います
- データファイルの作成
- 制御ファイルの作成
- REDOログ・ファイル
- システム表領域初期化
- データディクショナリの作成
$ dbca -silent -responseFile /home/oracle/dbca.rsp Copying database files 1% complete 3% complete -
しばらくすると終わりました
$ dbca -silent -responseFile /home/oracle/dbca.rsp Copying database files 1% complete 3% complete 37% complete Creating and starting Oracle instance 40% complete 45% complete 50% complete 55% complete 56% complete 60% complete 62% complete Completing Database Creation 66% complete 70% complete 73% complete 85% complete 96% complete 100% complete Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/ORCL/ORCL.log" for further details. $ -
oracleデータベースの実態ができました
$ ls -lh /u01/app/oracle/oradata/ORCL/ total 1.4G -rw-r----- 1 oracle oinstall 9.3M Jan 14 11:24 control01.ctl -rw-r----- 1 oracle oinstall 51M Jan 14 11:24 redo01.log -rw-r----- 1 oracle oinstall 51M Jan 14 11:20 redo02.log -rw-r----- 1 oracle oinstall 51M Jan 14 11:20 redo03.log -rw-r----- 1 oracle oinstall 461M Jan 14 11:20 sysaux01.dbf -rw-r----- 1 oracle oinstall 671M Jan 14 11:20 system01.dbf -rw-r----- 1 oracle oinstall 30M Jan 14 11:20 temp01.dbf -rw-r----- 1 oracle oinstall 76M Jan 14 11:20 undotbs01.dbf -rw-r----- 1 oracle oinstall 5.1M Jan 14 11:20 users01.dbf $
接続確認
Oracleは「dbaグループに所属するOSユーザーは信頼できる」と設定されている
- sqlplus / as sysdba
- / は、OS認証
- as sysdba データベース管理者権限
- 接続します
sqlplus / as sysdba - できました
$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Wed Jan 14 11:35:06 2026 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to: Oracle Database 11g Release 11.2.0.1.0 - 64bit Production SQL>
データベースの状態
-
データベースが稼働中であるか確認します(ユーザが接続・操作可能な状態です)
SQL> SELECT status FROM v$instance; STATUS ------------ OPEN SQL> -
データベース名はORCLでした
SQL> SELECT name FROM v$database; NAME --------- ORCL SQL>
Statspackをインストール
-
表領域を事前に確認します
SQL> SELECT tablespace_name FROM dba_tablespaces; TABLESPACE_NAME ------------------------------ SYSTEM SYSAUX UNDOTBS1 TEMP USERS SQL> -
Statspackをインストールします
SQL> @$ORACLE_HOME/rdbms/admin/spcreate.sql Choose the PERFSTAT user's password ----------------------------------- Not specifying a password will result in the installation FAILING Enter value for perfstat_password: -
パスワードを指定します
-
そのままEnterを押します(SYSAUX(推奨値)が自動選択される)
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 ------------------------------ --------- ---------------------------- SYSAUX PERMANENT * USERS PERMANENT Pressing <return> will result in STATSPACK's recommended default tablespace (identified by *) being used. Enter value for default_tablespace: -
そのままEnterを押します(TEMP(推奨値)が自動選択される)
Using tablespace SYSAUX 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. Enter value for temporary_tablespace: -
インストールが完了した
SQL> set echo off; Creating Package STATSPACK... Package created. No errors. Creating Package Body STATSPACK... Package body created. No errors. NOTE: SPCPKG complete. Please check spcpkg.lis for any errors. SQL> -
PERFSTATユーザが作成されているか確認します
SQL> SELECT username FROM dba_users WHERE username='PERFSTAT'; USERNAME ------------------------------ PERFSTAT 1 row selected. SQL>
スナップショットを取得
1時間ごとに自動スナップショットを取得する
事前準備
-
Statspackのレベルを確認します。パラメータが初期化されていません
SQL> SELECT snap_level FROM stats$statspack_parameter; no rows selected SQL> -
初期化します
- dbid, instance_number - データベース識別子(v$databaseから取得)
- session_id = 0 - 全セッション対象
- snap_level = 5 - 収集レベル(0-10、5推奨)
- num_sql = 20 - レポートに表示するSQL数
- executions_th = 100 - 実行回数の閾値
- parse_calls_th = 1000 - パース回数の閾値
- disk_reads_th = 1000 - ディスク読込の閾値
- buffer_gets_th = 10000 - バッファ取得の閾値
- pin_statspack = 'FALSE' - メモリ固定しない
- all_init = 'FALSE' - 全初期化パラメータ収集しない
INSERT INTO stats$statspack_parameter (dbid, instance_number, session_id, snap_level, num_sql, executions_th, parse_calls_th, disk_reads_th, buffer_gets_th, sharable_mem_th, version_count_th, pin_statspack, all_init, seg_phy_reads_th, seg_log_reads_th, seg_buff_busy_th, seg_rowlock_w_th, seg_itl_waits_th, seg_cr_bks_rc_th, seg_cu_bks_rc_th, old_sql_capture_mth) SELECT dbid, instance_number, 0, 5, 20, 100, 1000, 1000, 10000, 20971520, 20, 'FALSE', 'FALSE', 1000, 10000, 100, 100, 100, 100, 100, 'FALSE' FROM v$database, v$instance; COMMIT; 1 row created. -
LEVELが登録されました
SQL> SELECT snap_level FROM stats$statspack_parameter; SNAP_LEVEL ---------- 5 SQL>
自動スナップショットを有効化
-
spauto.sqlを実行します。自動スナップショットが正常に設定され、22時から1時間ごとにstatspack.snapが実行されます。
- JOBNO = 3
- ジョブ番号(Oracleジョブキューに登録されたジョブID)
- job_queue_processes = 1000
- バックグラウンドでジョブを実行するプロセス数
- 0より大きい必要がある(1000なので問題なし)
- Next scheduled run (次回実行予定)
- JOB=3, NEXT_DATE=14-JAN-26 13:00:00
SQL> @$ORACLE_HOME/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 ---------- 3 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 1000 Next scheduled run ~~~~~~~~~~~~~~~~~~ The next scheduled run for this job is: JOB NEXT_DATE NEXT_SEC ---------- --------- -------------------------------- 3 14-JAN-26 13:00:00 SQL> - JOBNO = 3
-
ジョブの設定内容についても確認します
SQL> SELECT job, next_date, interval FROM dba_jobs 2 3 WHERE job = 3; JOB NEXT_DATE INTERVAL ---------- --------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 3 14-JAN-26 trunc(SYSDATE+1/24,'HH') SQL>
手動で取得
1回目のスナップショット
- スナップショットを実行します
SQL> EXEC statspack.snap; PL/SQL procedure successfully completed. SQL> - スナップショット一覧を確認します
SQL> SELECT snap_id, snap_time, snap_level FROM stats$snapshot ORDER BY snap_id DESC; 2 3 SNAP_ID SNAP_TIME SNAP_LEVEL ---------- --------- ---------- 1 14-JAN-26 5 SQL>
負荷テスト用のテーブルとデータを作成
- テストテーブルを作成
SQL> -- テストテーブル作成 CREATE TABLE test_load ( id NUMBER, data VARCHAR2(100), created_date DATE );SQL> 2 3 4 5 Table created. SQL> desc test_load Name Null? Type ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ID NUMBER DATA VARCHAR2(100) CREATED_DATE DATE SQL> - 10万行挿入します
SQL> -- 10万行挿入 BEGIN FOR i IN 1..100000 LOOP INSERT INTO test_load VALUES (i, 'Test data ' || i, SYSDATE); IF MOD(i, 10000) = 0 THEN COMMIT; END IF; END LOOP; COMMIT; END; /SQL> 2 3 4 5 6 7 8 9 10 PL/SQL procedure successfully completed. SQL>
負荷をかけるクエリを実行
下記のようなクエリを何度か実行します
-
クエリ1実行
SQL> SELECT COUNT(*), MAX(id), MIN(id) FROM test_load; COUNT(*) MAX(ID) MIN(ID) ---------- ---------- ---------- 100000 100000 1 SQL> -
クエリ2実行
SELECT * FROM test_load WHERE id BETWEEN 1000 AND 2000 ORDER BY id -
クエリ3実行
SELECT data, COUNT(*) FROM test_load GROUP BY data;
2回目のスナップショット
- 取得します
SQL> EXEC statspack.snap; PL/SQL procedure successfully completed. SQL> - スナップショット一覧を確認します
SQL> SELECT snap_id, TO_CHAR(snap_time, 'YYYY-MM-DD HH24:MI:SS') as snap_time, snap_level FROM stats$snapshot ORDER BY snap_id; 2 3 SNAP_ID SNAP_TIME SNAP_LEVEL ---------- ------------------- ---------- 1 2026-01-14 12:32:24 5 2 2026-01-14 12:40:15 5 SQL>
レポートを生成
-
@$ORACLE_HOME/rdbms/admin/spreport.sqlを実行します
@$ORACLE_HOME/rdbms/admin/spreport.sql -
実行すると、begin_snapが聞かれるので、最初のSNAP_ID「1」を入力します
Current Instance ~~~~~~~~~~~~~~~~ DB Id DB Name Inst Num Instance ----------- ------------ -------- ------------ 1750295065 ORCL 1 ORCL Instances in this Statspack schema ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DB Id Inst Num DB Name Instance Host ----------- -------- ------------ ------------ ------------ 1750295065 1 ORCL ORCL XXXXX Using 1750295065 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 14 Jan 2026 12:32 5 2 14 Jan 2026 12:40 5 Specify the Begin and End Snapshot Ids ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Enter value for begin_snap: -
次に、end_snapにSNAP_IDの「2」を入力します
Specify the Begin and End Snapshot Ids ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Enter value for begin_snap: 1 Begin Snapshot Id specified: 1 Enter value for end_snap: -
次にレポート名が聞かれます。そのままEnterするとデフォルトで作られます
Specify the Begin and End Snapshot Ids ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Enter value for begin_snap: 1 Begin Snapshot Id specified: 1 Enter value for 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. Enter value for report_name: -
標準出力されますが、ファイルにも出力されます
Enter value for report_name: Using the report name sp_1_2 STATSPACK report for Database DB Id Instance Inst Num Startup Time Release RAC ~~~~~~~~ ----------- ------------ -------- --------------- ----------- --- 1750295065 ORCL 1 14-Jan-26 11:20 11.2.0.1.0 NO Host Name Platform CPUs Cores Sockets Memory (G) ~~~~ ---------------- ---------------------- ----- ----- ------- ------------ XXXXXXXXXX Linux x86 64-bit 2 1 1 7.7 Snapshot Snap Id Snap Time Sessions Curs/Sess Comment ~~~~~~~~ ---------- ------------------ -------- --------- ------------------ Begin Snap: 1 14-Jan-26 12:32:24 22 1.5 End Snap: 2 14-Jan-26 12:40:15 22 1.5 Elapsed: 7.85 (mins) Av Act Sess: 0.0 DB time: 0.08 (mins) DB CPU: 0.08 (mins) Cache Sizes Begin End ~~~~~~~~~~~ ---------- ---------- Buffer Cache: 864M Std Block Size: 8K Shared Pool: 304M Log Buffer: 4,600K ・・・・
レポートを確認
- Oracleからログアウトします
SQL> exit - ファイルができていました
$ ls -l sp_1_2.lst -rw-r--r-- 1 oracle oinstall 85973 Jan 14 12:52 sp_1_2.lst $ pwd /home/oracle $ ls -l sp_1_2.lst -rw-r--r-- 1 oracle oinstall 85973 Jan 14 12:52 sp_1_2.lst $
STATSPACK report
- データベースのバージョン、OS、CPUコア、メモリ、セッション数の確認ができる
STATSPACK report for
Database DB Id Instance Inst Num Startup Time Release RAC
~~~~~~~~ ----------- ------------ -------- --------------- ----------- ---
1750295065 ORCL 1 14-Jan-26 11:20 11.2.0.1.0 NO
Host Name Platform CPUs Cores Sockets Memory (G)
~~~~ ---------------- ---------------------- ----- ----- ------- ------------
XXXXXXXXXXXXXXXX Linux x86 64-bit 2 1 1 7.7
Snapshot Snap Id Snap Time Sessions Curs/Sess Comment
~~~~~~~~ ---------- ------------------ -------- --------- ------------------
Begin Snap: 1 14-Jan-26 12:32:24 22 1.5
End Snap: 2 14-Jan-26 12:40:15 22 1.5
Elapsed: 7.85 (mins) Av Act Sess: 0.0
DB time: 0.08 (mins) DB CPU: 0.08 (mins)
- Elapsed:処理の開始から終了までの実際の時間
- CPU Time + Wait Time
- CPU Time: 2秒(実際の計算時間)
- Wait Time: 3秒(I/O待ち、ロック待ち)
- Elapsed Time: 5秒(実際にかかった時間)
- Av Act Sess:Average Active Sessions(平均アクティブセッション数)
- 同時に処理を実行していたセッションの平均数
- データベースの実負荷を表す重要指標
Load Profile
- 絶対値 - 実際の処理量
- 用途: キャパシティプランニング、負荷測定
$ sed -n '/Load Profile/,/Instance Efficiency/p' sp_*.lst
Load Profile Per Second Per Transaction Per Exec Per Call
~~~~~~~~~~~~ ------------------ ----------------- ----------- -----------
DB time(s): 0.0 0.4 0.00 0.00
DB CPU(s): 0.0 0.4 0.00 0.00
Redo size: 60,302.0 2,366,854.7
Logical reads: 254.9 10,004.8
Block changes: 437.2 17,158.6
Physical reads: 0.0 0.2
Physical writes: 0.0 0.0
User calls: 86.1 3,377.5
Parses: 0.8 30.2
Hard parses: 0.1 4.5
W/A MB processed: 0.2 8.0
Logons: 0.0 0.1
Executes: 214.8 8,429.4
Rollbacks: 0.0 0.0
Transactions: 0.0
Instance Efficiency Indicators
$
- DB time(s):全セッションの(CPU時間 + 待機時間)の合計
- DB CPU(s):全セッションが実際にCPUを使った時間の合計
- Redo size:トランザクションログ(変更履歴)の書き込み量
- INSERT/UPDATE/DELETEの量を表す
- Logical reads:メモリ(バッファキャッシュ)からのデータブロック読み込み回数
- Block changes:データブロックが変更(更新)された回数
- INSERT/UPDATE/DELETEによる変更
- Physical reads:ディスクからデータブロックを読み込んだ回数
- メモリになくてディスクアクセスが必要だった回数
- Physical writes:ディスクへデータブロックを書き込んだ回数
- ダーティバッファ(変更済みブロック)のディスク書き込み
- User calls:アプリケーションからデータベースへの呼び出し回数
- SQL実行、COMMIT、FETCH等の操作
- Parses:SQLの解析(構文チェック、実行計画作成)回数
- Soft Parse + Hard Parseの合計
- Hard parses:SQLを完全に解析し直した回数(最も重い処理)
- W/A MB processed:ソート、ハッシュ結合等で使用したメモリ量
- W/A = Work Area(作業領域)
- Logons:データベースへの新規接続回数
- セッション確立の回数
- Executes:SQL文(SELECT/INSERT/UPDATE/DELETE)の実行回数
- データベースの処理量を表す基本指標
- Rollbacks:エラーや明示的なROLLBACK文
- Transactions:COMMIT(確定)されたトランザクション数
Instance Efficiency Indicators
- 基本的に、すべての値を100%に近づけられているのが目標
- 比率(%) - 効率性の評価
- 用途: チューニング、問題検出
Instance Efficiency Indicators
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Buffer Nowait %: 100.00 Redo NoWait %: 100.00
Buffer Hit %: 100.00 Optimal W/A Exec %: 100.00
Library Hit %: 99.73 Soft Parse %: 85.08
Execute to Parse %: 99.64 Latch Hit %: 99.98
Parse CPU to Parse Elapsd %: 300.00 % Non-Parse CPU: 99.21
- Buffer Nowait: バッファ(メモリ上のデータブロック)にアクセスした時、待たずに取得できた割合
- Redo NoWait:REDOログバッファ(トランザクションログ用メモリ)に書き込む時、待たずに書けた割合
- Buffer Hit:ディスクI/Oせずにメモリから読めた率
- Optimal W/A Exec:SQL実行時のソート/ハッシュ処理が、メモリ内だけで完了した割合
- Library Hit:SQL実行時、既にパース済み(解析済み)のSQL実行計画をメモリから再利用できた割合
- Soft Parse:SQL実行時、既存の実行計画を再利用できた割合
- Execute to Parse:SQL実行回数に対するパース(解析)回数の比率
- Latch Hit:Latch(軽量ロック)を待たずに取得できた割合
- Parse CPU to Parse Elapsd:パース処理時間のうち、実際にCPUを使っていた割合
- Non-Parse CPU:総CPU時間のうち、パース以外(実際のSQL実行)に使われた割合
Shared Pool Statistics
Shared Pool Statistics Begin End
------ ------
Memory Usage %: 58.47 59.38
% SQL with executions>1: 38.34 42.15
% Memory for SQL w/exec>1: 37.33 42.79
- Memory Usage: 共有プールの割合
- SQL with executions:再利用されたSQLの割合
- Memory for SQL w/exec:2回以上実行されたSQLがしようされたメモリの割合
Top 5 Timed Events
- 待機時間トップ5
- データベースが最も時間を費やした待機イベントのトップ5
- パフォーマンス問題の原因を特定する最重要セクション
Top 5 Timed Events Avg %Total
~~~~~~~~~~~~~~~~~~ wait Call
Event Waits Time (s) (ms) Time
----------------------------------------- ------------ ----------- ------ ------
CPU time 4 84.8
control file parallel write 175 0 2 8.5
log file parallel write 78 0 3 5.2
log file switch completion 2 0 17 .7
log file sync 3 0 5 .4
-------------------------------------------------------------
- CPU time:
- 実際の処理時間(待機ではない)
- 高い = 計算処理多い
- control file parallel write
- 制御ファイル並列書き込み待機
- 制御ファイル(データベース構造情報)への書き込み待ち
- 複数の制御ファイルコピーへ同時書き込み
- log file parallel write
- REDOログファイル並列書き込み待機
- REDOログファイル(トランザクションログ)への書き込み待ち
- LGWRプロセス(ログライター)がディスクに書き込む時間
- log file switch completion
- ログファイル切り替え完了待ち
- REDOログファイルが満杯になり、次のログファイルへ切り替える待ち
- 次のログファイルがアーカイブ中で使用できない
- log file sync
- ログファイル同期待ち
- COMMIT時、REDOログがディスクに書き込まれるのを待つ時間
- トランザクション確定の待機
Instance CPU
- インスタンス全体のCPU使用状況
- データベースインスタンス全体(全プロセス)のCPU統計
- ユーザープロセス + バックグラウンドプロセス
Instance CPU
~~~~~~~~~~~~ % Time (seconds)
-------- --------------
Host: Total time (s): 937.2
Host: Busy CPU time (s): 18.0
% of time Host is Busy: 1.9
Instance: Total CPU time (s): 4.8
% of Busy CPU used for Instance: 26.8
Instance: Total Database time (s): 5.7
%DB time waiting for CPU (Resource Mgr): 0.0
- Host: Total time:ホスト全体のCPU時間
- サーバー(OS)全体で利用可能なCPU時間の合計
- 全CPUコア × 測定時間
- Host: Busy CPU time :ホスト全体の実使用CPU時間
- サーバー(OS)全体で実際にCPUが使われた時間
- Oracle + OS + 他プロセス全ての合計
- % of time Host is Busy:ホストビジー率
- サーバー全体のCPU使用率(%)
- アイドル時間を除いた稼働率
- Instance: Total CPU time (s):インスタンス総CPU時間
- Oracleインスタンス(全プロセス)が使用した総CPU時間(秒)
- 測定期間全体の累積
- % of Busy CPU used for Instance:インスタンスCPU占有率
- サーバーの実使用CPU時間のうち、Oracleが使った割合
- Oracle vs その他(OS、他アプリ)の比率
- Instance: Total Database time (s):インスタンス総データベース時間
- 全セッションのDB time(CPU + 待機)の合計
- データベースの総負荷量
- %DB time waiting for CPU (Resource Mgr):CPU待ち時間率
- DB timeのうち、CPUが空くのを待っていた時間の割合
- Resource Manager(リソース管理)によるCPU割り当て待ち
Memory Statistics
- メモリ統計
- Oracleインスタンスのメモリ使用状況
- SGA(共有メモリ)とPGA(プロセスメモリ)の詳細
Memory Statistics Begin End
~~~~~~~~~~~~~~~~~ ------------ ------------
Host Mem (MB): 7,857.7 7,857.7
SGA use (MB): 2,038.8 2,038.8
PGA use (MB): 62.7 61.2
% Host Mem used for SGA+PGA: 26.7 26.7
- Host Mem (MB):ホスト物理メモリ
- サーバーに搭載されている物理メモリの総量
- OS + Oracle + 他プロセスで共有
- SGA use:SGA(System Global Area)使用量
- 共有メモリ領域の使用状況
- 全セッションで共有されるメモリ
- PGA use (MB):PGA(Program Global Area)使用量
- 各セッション専用のメモリ使用量
- セッションごとに個別に割り当て
- ソート処理(ORDER BY)
- ハッシュ結合(HASH JOIN)
- グループ化(GROUP BY)
- セッション変数
- % Host Mem used for SGA+PGA:Oracle総メモリ使用率
- サーバーの物理メモリのうち、Oracleが使用している割合
- SGA(共有)+ PGA(セッション)の合計
スナップショットのサイズ
- スナップショットのサイズを確認します
SQL> SELECT ROUND(SUM(bytes)/1024/1024, 2) as total_size_mb FROM dba_segments WHERE owner = 'PERFSTAT'; 2 3 4 TOTAL_SIZE_MB ------------- 151.75 SQL>
Oracleの停止
- SHUTDOWNで停止します
SQL> SHUTDOWN IMMEDIATE; Database closed. Database dismounted. ORACLE instance shut down. SQL>
Oracleの再開
- STARTUPで開始します
SQL> STARTUP; ORACLE instance started. Total System Global Area 2137886720 bytes Fixed Size 2215064 bytes Variable Size 1224737640 bytes Database Buffers 905969664 bytes Redo Buffers 4964352 bytes Database mounted. Database opened. SQL>
考察
今回、Oracleデータベースから、Statspackのインストールまで試してみました。
Statspackのレポートの読み方に苦戦しましたが、なんとなく概要はわかりました。
参考
