>> i's SQUARE >> Oracleのノウハウ >> STATSPACKの使い方

STATSPACKの使い方




STATSPACKは、DBのパフォーマンスチェックに有用なツールです。 基本的にSTATSPACKの統計情報を利用してDBのチューニングを行います。

STATSPACKを利用するには、まず事前準備として 統計情報を格納する表領域を作成しておく必要があります。 表領域のサイズは、250MBでおよそ1000回分の統計情報の格納が可能です。


◆インストール

% cd $ORACLE_HOME
SQL> conn / as sysdba
SQL> @rdbms/admin/spcreate.sql

(パスワードと、表領域、一時表領域を入力する)


◆スナップショットの取得

SQL> execute statspack.snap(i_ucomment => 'This is Comment');

This is Comment 等のコメントを入れられます。 他に、i_snap_level(スナップショットのレベル)等の指定が可能です。


◆スナップショットの履歴確認

col ucomment format a50
select snap_id, to_char(snap_time, 'YY-MM-DD HH24:MI:SS') snap_time, ucomment from stats$snapshot order by 1




◆レポートの作成

% cd $ORACLE_HOME
% bin/sqlplus /nolog
SQL> conn ID/パスワード
SQL> @rdbms/admin/spreport
begin_snapに値を入力してください: ←作成するレポートに含める統計情報の開始期間を決めて対象の「Snapshot Id」を入力する
end_snapに値を入力してください: ←作成するレポートに含める統計情報の終了期間を決めて対象の「Snapshot Id」を入力する
report_nameに値を入力してください: ←作成するレポートのファイル名を入力する

これで、sqlplusを起動したディレクトリにレポートファイルが作成されます。

さらに、SQL詳細レポートも作成可能です。
・spreport等から、負荷の高いSQL文のハッシュ値を取得
(但し、スナップショットレベルが6以上でなければ、SQL文レベルの情報は取れません)
・sprepsql.sqlを実行してレポートを作成


レポートの分析
・「Top 5 Timed Events」:時間のかかる処理を表示してます
・「CPU Time」:CPUの処理時間です
・「library cache pin」:ライブラリキャッシュに、解析済みSQLやオブジェクト情報を乗せる処理です
(バインドされていないSQLが多いために、解析済みSQLが共有プールから追い出されてしまっているかを調べ、ほとんどバインドできているのなら、Shared_pool_sizeが不足しています)
・「db file sequential read」:インデックスを使った単一ブロック読み込み時間です
・「db file scatterd read」:全表操作によるマルチブロック読み込み時間です

_SQL ordered by Gets for DB: 」セクション

効率の悪いSQLを特定します。 メモリ上のOracleブロックへのアクセスが多い順にSQLを表示してます。 CPUリソースを消費しているのでSQLの改善が必要です。
尚、表示されるSQLは一部であるため、 v$sqltextでhash_valueを指定して全体を取得する必要があります。

SQL> select sql_text from v$sqltext where hash_value = XXXXXX order by piece;



_SQL ordered by Reads for DB: 」セクション

Disk Readが多い順にSQLを表示してます。 I/Oがネックになっている場合は、ここのSQLを改善します。


◆不要データの削除

% cd $ORACLE_HOME
% bin/sqlplus /nolog
SQL> conn ID/パスワード
SQL> @rdbms/admin/sppurge
losnapidに値を入力してください: ←削除したいSnap Idの開始値を入力する
hisnapidに値を入力してください: ←削除したいSnap Idの終了値を入力する





SQLの改善以外にも適切な索引を貼る事でパフォーマンスが改善される事があります。 例えば、WHERE条件列、参照列の索引を貼れば効果的です。

CREATE INDEX 索引名 ON テーブル名 (索引を貼る項目名)
/

また、最適な実行計画を強制的に使わせるために SQLのSELECTの後にINDEXヒントを指定する事も出来ます。

SELECT /*+ INDEX(テーブル名 索引名) */



人があやしてくれる時に笑いなさい。
でないと、やがて人はあやしてくれなくなりますよ。
by 西洋のことわざ