Oracle:Statspack操作に関連するSQL | けしくんのWebLog

けしくんのWebLog

自分が考えたこと、調べたことを忘れずに残しておくため、Web上にLogを残していきます。

テーマ:

OracleDBの状態を把握するために使用されるStatspacのインストールやレポート作成方法について。

同様のことがAWRでも可能だが、AWRはオプションライセンス(Diagnostic Pack)を購入していないと、AWRリポジトリへのアクセスを行うだけでライセンス違反となるので注意が必要。

(ただし、DB作成時デフォルトでAWRは稼動しており、アクセスしようと思ったらいつでもできてしまう。Oracleのライセンスは紳士協定のため。)

一方、Statspackは無償で使用できる機能である。

 

もっと細かい設定がしたければ、マニュアルをみる。

また、Statspackレポートの見方については、マニュアル等を参照。


よく使うOracle SQL/コマンドまとめ

 

Statspackのインストール

connect / as sysdba

@?/rdbms/admin/spcreate.sql

(略)

perfstat_passwordに値を入力してください:PERSTATユーザーのパスワード

(略)

default_tablespaceに値を入力してください:PERFSTATユーザーのデフォルト表領域としたい表領域を指定

(略)

temporary_tablespaceに値を入力してください:PERFSTATユーザーの一時表領域としたい表領域を指定

※@マークの後ろの「?」はORACLE_HOMEを表す。

PERFSTATユーザーが自動的に作成されるため、ユーザー作成のために必要な情報を対話形式で入力する。

事前にデフォルトとしたい表領域、一時表領域は作成しておく。

 

Statspackのインストール

connect / as sysdba

@?/rdbms/admin/spcreate.sql

(略)

perfstat_passwordに値を入力してください:PERSTATユーザーのパスワード

(略)

default_tablespaceに値を入力してください:PERFSTATユーザーのデフォルト表領域としたい表領域を指定

(略)

temporary_tablespaceに値を入力してください:PERFSTATユーザーの一時表領域としたい表領域を指定

※PERFSTATユーザーが自動的に作成されるため、ユーザー作成のために必要な情報を対話形式で入力する。

事前にデフォルトとしたい表領域、一時表領域は作成しておく。

 

Snapshotの取得

connect perfstat
EXECUTE STATSPACK.SNAP

※デフォルトでは、Snapshotのレベルは5で取得される。別のレベルで取得したい場合は、デフォルト値を変更する(後述)か、取得時にレベルを指定する(I_SNAP_LEVELパラメータ)。

たいていの場合、レベル7で取得しておけば事足りる。

・EXECUTE STATSPACK.SNAP(I_SNAP_LEVEL=>7)

 

Snapshotレベルのデフォルト値変更

connect perfstat
EXECUTE STATSPACK.MODIFY_STATSPACK_PARAMETER(I_SNAP_LEVEL=>変更後のレベル);

 

Snapshot一覧の表示

connect perfstat
SELECT SNAP_ID, SNAP_LEVEL, TO_CHAR(SNAP_TIME, 'YYYY/MM/DD HH24:MI:SS')
FROM STATS$SNAPSHOT
ORDER BY SNAP_ID;

 

Statspackのレポート作成(手動)

connect perfstat
@?/rdbms/admin/spreport.sql
(略)
(画面にSnapIDの一覧が表示される)
begin_snapに値を入力してください:起点となるSnapIDを指定
(略)
end_snapに値を入力してください:終点となるSnapIDを指定
(略)
report_nameに値を入力してください:レポート名を指定
(略)
レポートが画面表示される(レポートは指定したレポート名でファイルとして保存される)

※@マークの後ろの「?」はORACLE_HOMEを表す。

レポート名のデフォルトは「sp_指定したbegin_snapの値_指定したend_snapの値.lst」。

対話形式ではなく、自動化も可能。

 

Statspackのレポート作成(自動化用)

connect perfstat

DEFINE BEGIN_SNAP=SnapIDを指定
DEFINE END_SNAP=SnapIDを指定
DEFINE REPORT_NAME=レポート名を指定

@?/rdbms/admin/spreport

※@マークの後ろの「?」はORACLE_HOMEを表す。

上記をベースに、事前にSnapIDを確認し、BEGIN_SNAP、END_SNAPに指定するようなスクリプトを作成すれば、自動的にレポートを作成することが可能となる。

 

Statspackレポート内の特定SQL詳細レポートの作成

Statspackレポートに書かれたSQLについて、実行計画等の詳細情報を取得したい場合

事前にStatspackレポートから、該当SQLの「Old Hash Value」を控えておく。

connect perfstat
@?/rdbms/admin/sprepsql.sql
(略)
(画面にSnapIDの一覧が表示される)
begin_snapに値を入力してください:Statspackレポート作成時と同じSnapIDを指定
(略)
end_snapに値を入力してください:Statspackレポート作成時と同じSnapIDを指定
(略)
hash_valueに値を入力してください: 控えておいた「Old Hash Value」を指定
(略)
report_nameに値を入力してください:レポート名を指定
(略)
レポートが画面表示される(レポートは指定したレポート名でファイルとして保存される)

※@マークの後ろの「?」はORACLE_HOMEを表す。

レポート名のデフォルトは「sp_指定したbegin_snapの値_指定したend_snapの値_Old Hash Valueの値.lst」。

 

Snapshotの削除

Statspackレポートに書かれたSQLについて、実行計画等の詳細情報を取得したい場合

事前にStatspackレポートから、該当SQLの「Old Hash Value」を控えておく。

connect perfstat

-- スナップショットIDの範囲を指定して削除
EXECUTE STATSPACK.PURGE(I_BEGIN_SNAP=>削除したい開始SnapID, I_END_SNAP=>削除したい終了SnapID, I_EXTENDED_PURGE=>TRUE)

 

--スナップショットの取得日時範囲を指定して削除
EXECUTE STATSPACK.PURGE(I_BEGIN_DATE=>削除したい開始日付(TO_DATE関数で指定), I_END_DATE=>削除したい終了日付(TO_DATE関数で指定), I_EXTENDED_PURGE=>TRUE)

 

--特定日時以前に取得したスナップショットを削除
EXECUTE STATSPACK.PURGE(I_PURGE_BEFORE_DATE=>特定日時(TO_DATE関数で指定), I_EXTENDED_PURGE=>TRUE)
 

--指定日数分のスナップショットを残して削除
EXECUTE STATSPACK.PURGE(I_NUM_DAYS=>残したい日数(数字), I_EXTENDED_PURGE=>TRUE

※I_EXTENDED_PURGE をTRUEにすることで、どのスナップショットからも参照されなくなったSQL情報(SQL本文や実行計画)も削除する。

SnapID指定の場合、そのIDがないとエラーになるため、日付を指定するやり方がオススメ。

 

Statspackのアンインストール

connect / as sysdba
@?/rdbms/admin/spdrop.sql

※@マークの後ろの「?」はORACLE_HOMEを表す。