ablog

不器用で落着きのない技術者のメモ

STATSPACK でスナップショットを自動収集する方法

STATSPACK を使ってみる - ablog でスナップショットを自動取得する手順を書いた。これは、スナップショットを自動取得するようにした後に、スナップショット取得間隔を変更する手順。

$ sqlplus perfstat/perfstat
--自動的にスナップショットを取得するよう設定する(デフォルトで1時間毎)
SQL> @?/rdbms/admin/spauto.sql
--スナップショット取得間隔を30分毎に変更する。
SQL> execute dbms_job.interval(1, 'SYSDATE+1/48');

以下は同じことを一発でやる手順。

$ sqlplus perfstat/perfstat
SQL> variable jobno number;
SQL> exec dbms_job.submit(:jobno, 'statspack.snap;', sysdate, 'SYSDATE+1/48');
SQL> commit;

commit を発行する必要があるので注意。
実行間隔は1時間毎なら SYSDATE+1/24、30分毎なら SYSDATE+1/48、1分毎なら SYSDATE+1/(24*60)、1日毎なら SYSDATE + 1。つまり、実行間隔の単位は日。
jobno は INPUT ではなくOUTPUT。ジョブを登録すると、jobno にジョブ番号が入る。ジョブ番号の確認方法は以下の通り。

SQL> print jobno

dbms_jobパッケージで提供されるJOB機能を使うには、初期化パラメータ JOB_QUEUE_PROCESSES が 1 以上である必要がある。

  • Oracle のマニュアルからの引用

JOB_QUEUE_PROCESSESには、ジョブ実行用に作成できるプロセスの最大数を指定します。

http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19228-03/initparams.htm#78756

SUBMITプロシージャ

このプロシージャは新規ジョブを送信します。順序sys.jobseqからジョブを選択します。

構文

DBMS_JOB.SUBMIT (
   job       OUT BINARY_INTEGER,
   what      IN  VARCHAR2,
   next_date IN  DATE DEFAULT sysdate,
   interval  IN  VARCHAR2 DEFAULT 'null',
   no_parse  IN  BOOLEAN DEFAULT FALSE,
   instance  IN  BINARY_INTEGER DEFAULT any_instance,
   force     IN  BOOLEAN DEFAULT FALSE);

パラメータ

表48-9 SUBMITプロシージャのパラメータ

パラメータ 説明
job 実行するジョブの番号。
what 実行するPL/SQLプロシージャ。
next_date ジョブを次回実行する日付。
interval ジョブを次回実行する時間を計算する日付ファンクション。デフォルトはNULLです。このファンクションは、将来の日時またはNULLに設定される必要があります。
no_parse フラグ。デフォルトはFALSEです。FALSEに設定すると、ジョブに関連付けられているプロシージャが解析されます。TRUEに設定すると、ジョブに関連付けられているプロシージャがそのジョブの初回実行時に解析されます。たとえば、ジョブに関連付けられている表を作成する前にそのジョブを送信する場合は、この値をTRUEに設定します。
instance ジョブの送信時にそのジョブを実行できるインスタンスを指定します。
force TRUEの場合は、ジョブ・インスタンスとして正の整数がすべて受け入れられます。FALSE(デフォルト)の場合は、指定したインスタンスが実行している必要があり、そうでない場合は、ルーチンに例外が発生します。

使用上の注意

この文の直後にCOMMIT文を実行する必要があります。

パラメータinstanceおよびforceがジョブ・キュー親和性のために追加されています。ジョブ・キュー親和性を使用して、ユーザーは、送信されたジョブを特定のインスタンスで実行するか、またはどのインスタンスでも実行できるようにするかを指示できます。

新規ジョブをジョブ・キューに送る例です。このジョブは、プロシージャDBMS_DDL.ANALYZE_OBJECTをコールし、表DQUON.ACCOUNTSに関するオプティマイザの統計情報を生成します。統計情報は、ACCOUNTS表にある行の半分をサンプルとして使用します。このジョブは24時間ごとに実行されます。

VARIABLE jobno number;
BEGIN
   DBMS_JOB.SUBMIT(:jobno,
      'dbms_ddl.analyze_object(''TABLE'',
      ''DQUON'', ''ACCOUNTS'',
      ''ESTIMATE'', NULL, 50);'
      SYSDATE, 'SYSDATE + 1');
   COMMIT;
END;
/
Statement processed.
print jobno
JOBNO
----------
14144
DBMS_JOB
...

spool spauto.lis

...

variable jobno number;
variable instno number;
begin
  select instance_number into :instno from v$instance;
  dbms_job.submit(:jobno, 'statspack.snap;', trunc(sysdate+1/24,'HH'), 'trunc(SYSDATE+1/24,''HH'')', TRUE, :instno);
  commit;
end;
/

...

print jobno

...

show parameter job_queue_processes

...

select job, next_date, next_sec
  from user_jobs
 where job = :jobno;

spool off;