アプリケーション開発者は、Oracle TraceおよびSQLトレース機能を持つDBMS_APPLICATION_INFOパッケージを使用して、実行しているモジュール名またはトランザクションをデータベースに記録できます。この記録は、後で行う様々なモジュールおよびデバッグのパフォーマンスを追跡するときに使用されます。
この章では、次の項目について説明します。
概要
セキュリティ・モデル
使用上の注意
アプリケーションを登録することによって、システム管理者およびパフォーマンス・チューニング担当者は、パフォーマンスをモジュール別に追跡できます。システム管理者は、モジュール別のリソース使用率をこの情報から追跡することもできます。アプリケーションをデータベースに登録すると、その名前およびアクションがV$SESSIONおよびV$SQLAREAビューに記録されます。
|
注意: DBMS_APPLICATION_INFOのパブリック・シノニムが作成前に削除されることはありません。これは、ユーザーがパブリック・シノニムをユーザー独自のパッケージまでリダイレクトできるようにするためです。 |
これ以上の権限は不要です。DBMSAPIN.SQLスクリプトは、標準データベース作成の一部としてすでに実行されています。
ユーザーがモジュールを入力するたびに、アプリケーションがモジュール名およびアクション名を自動的に設定するようにしてください。モジュール名は、Oracle Formsアプリケーションのフォーム名またはOracleプリコンパイラ・アプリケーションのコード・セグメント名である場合があります。アクション名は、通常、モジュール内の現行トランザクションの名前または説明にしてください。
モジュールに基づいて独自の統計情報を収集する場合は、統計を最初に収集する別のスキーマにこのパッケージのバージョンを記述してこのパッケージにラッパーを実装してから、SYSバージョンのパッケージをコールします。このようにして、DBMS_APPLICATION_INFOのパブリック・シノニムを、DBAバージョンのパッケージまで変更できます。
表20-1 DBMS_APPLICATION_INFOパッケージのサブプログラム
| サブプログラム | 説明 |
|---|---|
|
|
現行セッションの |
|
|
現行セッションのモジュールおよびアクションのフィールド値を読み込みます。 |
|
|
現行モジュール内の現行アクション名を設定します。 |
|
|
セッションの |
|
|
現在実行中のモジュール名を新規モジュールに設定します。 |
|
|
|
このプロシージャは、現行セッションのモジュールおよびアクション・フィールドの値を読み込みます。
使用上の注意
登録アプリケーションのモジュール名およびアクション名は、V$SQLAREAを問い合せるか、またはREAD_MODULEプロシージャをコールして取り出せます。クライアント情報は、V$SESSIONビューを問い合せるか、またはREAD_CLIENT_INFOプロシージャをコールして取り出せます。
例
次の問合せのサンプルは、V$SQLAREAのMODULEおよびACTION列の使用方法の例です。
SELECT sql_text, disk_reads, module, action FROM v$sqlarea WHERE module = 'add_employee'; SQL_TEXT DISK_READS MODULE ACTION ------------------- ---------- ------------------ ---------------- INSERT INTO emp 1 add_employee insert into emp (ename, empno, sal, mgr, job, hiredate, comm, deptno) VALUES (name, next.emp_seq, manager, title, SYSDATE, commission, department) 1 row selected.
このプロシージャは、現行モジュール内の現行アクション名を設定します。
使用上の注意
アクション名には、実行されている現行のアクションを説明する名前を設定してください。アクション名は、すべてのトランザクションの開始前に設定することをお薦めします。
後続のトランザクションのログが正しく記録されるように、トランザクション完了後はトランザクション名をNULLに設定してください。トランザクション名をNULLに設定しないと、後続のトランザクションのログがその前のトランザクション名で記録される可能性があります。
例
次のコードは、登録プロシージャを使用するトランザクションの例です。
CREATE OR REPLACE PROCEDURE bal_tran (amt IN NUMBER(7,2)) AS
BEGIN
-- balance transfer transaction
DBMS_APPLICATION_INFO.SET_ACTION(
action_name => 'transfer from chk to sav');
UPDATE chk SET bal = bal + :amt
WHERE acct# = :acct;
UPDATE sav SET bal = bal - :amt
WHERE acct# = :acct;
COMMIT;
DBMS_APPLICATION_INFO.SET_ACTION(null);
END;
このプロシージャは、現行のアプリケーションまたはモジュールの名前を設定します。
例
CREATE or replace PROCEDURE add_employee(
name VARCHAR2,
salary NUMBER,
manager NUMBER,
title VARCHAR2,
commission NUMBER,
department NUMBER) AS
BEGIN
DBMS_APPLICATION_INFO.SET_MODULE(
module_name => 'add_employee',
action_name => 'insert into emp');
INSERT INTO emp
(ename, empno, sal, mgr, job, hiredate, comm, deptno)
VALUES (name, emp_seq.nextval, salary, manager, title, SYSDATE,
commission, department);
DBMS_APPLICATION_INFO.SET_MODULE(null,null);
END;
このプロシージャは、V$SESSION_LONGOPSビューに行を設定します。このビューは、長時間にわたって実行する操作の進行状況を示すために使用されます。パラレル実行やServer Managed Recoveryなどの一部のOracle機能は、このビューの行を使用してデータベース・バックアップなどの状態を示します。
アプリケーション固有の長時間実行タスクの進行状況に関する情報を通知するために、アプリケーションでSET_SESSION_LONGOPSプロシージャを使用できます。この結果、V$SESSION_LONGOPSビューで進行状況を監視できます。
構文
DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS ( rindex IN OUT BINARY_INTEGER, slno IN OUT BINARY_INTEGER, op_name IN VARCHAR2 DEFAULT NULL, target IN BINARY_INTEGER DEFAULT 0, context IN BINARY_INTEGER DEFAULT 0, sofar IN NUMBER DEFAULT 0, totalwork IN NUMBER DEFAULT 0, target_desc IN VARCHAR2 DEFAULT 'unknown target', units IN VARCHAR2 DEFAULT NULL) set_session_longops_nohint constant BINARY_INTEGER := -1;
パラメータ
表20-7 SET_SESSION_LONGOPSプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
更新する |
|
|
|
|
|
長時間実行タスクの名前を指定します。 |
|
|
長時間実行操作中に処理されるオブジェクトを指定します。たとえば、ソートされる表のIDなどを指定します。 |
|
|
クライアントが格納する数。 |
|
|
クライアントが格納する数。 |
|
|
クライアントが格納する数。 |
|
|
この長時間操作で操作されるオブジェクトの説明を指定します。この結果、 |
|
|
|
例
この例では、ループ内で10個のオブジェクトに対してタスクを実行します。各オブジェクトの処理が完了するたびに、プロシージャの進行状況に関するV$SESSION_LONGOPSが更新されます。
DECLARE
rindex BINARY_INTEGER;
slno BINARY_INTEGER;
totalwork number;
sofar number;
obj BINARY_INTEGER;
BEGIN
rindex := dbms_application_info.set_session_longops_nohint;
sofar := 0;
totalwork := 10;
WHILE sofar < 10 LOOP
-- update obj based on sofar
-- perform task on object target
sofar := sofar + 1;
dbms_application_info.set_session_longops(rindex, slno,
"Operation X", obj, 0, sofar, totalwork, "table", "tables");
END LOOP;
END;