プログラミング・プラクティス

次のプログラミング方法を使用します。

インスツルメンテーション・パッケージの使用

Oracle Databaseにはインスツルメンテーション・パッケージが用意されており、このパッケージに含まれるサブプログラムを使用して、必要なときにいつでもアプリケーション・トレース情報を生成できます。このトレース情報を使用すると、デバッガを使用せずにアプリケーションをデバッグでき不正なコードを特定できます。

インスツルメンテーションは、アプリケーションに多数の機能を提供しているため、オーバーヘッドではありません。オーバーヘッドは、多くの利点を失わずに削除できる部分です。

Oracle Databaseでは、次のインストゥルメンテーション・パッケージが提供されます。

関連項目: Oracle Databaseが提供するPL/SQLパッケージの概要は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照

統計の収集およびアプリケーション・トレース

データベース統計ではデータベースの負荷のタイプ、およびデータベースで使用する内部および外部リソースに関する情報が提供されます。ADDMを使用したデータベースでパフォーマンスの問題を正確に診断するには、統計が使用可能である必要があります。

統計の収集の詳細は、『Oracle Database 2日間でパフォーマンス・チューニング・ガイド』を参照してください。

ノート: Oracle Enterprise Managerを使用できない場合、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』の記載に従い、DBMS_MONITORサブプログラムを使用して統計を収集できます。

Oracle Databaseには、Oracle Databaseアプリケーションの監視および分析に使用できるトレース・ツールがいくつか用意されています。詳細は、『Oracle Database SQLチューニング・ガイド』を参照してください。

既存機能の使用

既存の機能を使用しているアプリケーションは、そうではないアプリケーションよりも開発およびメンテナンスが簡単であり、また実行速度も速くなります。

アプリケーションを開発するときは、プログラミング言語、オペレーティング・システム、Oracle Database、およびOracle Databaseで提供されているPL/SQLパッケージおよびタイプの既存の機能を可能なかぎり使用してください。

多くの開発者が再開発する既存の機能の例には、次の機能があります。

例8-4では、2つの同時トランザクションが表に格納されたメッセージをデキューします(つまり、各トランザクションは、表の次の未処理行を検出しロックします)。例では、DBMS_AQ.DEQUEUEプロシージャ(『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照)を単純に起動するのではなく、この例では、表のファンクション索引が作成され、次にそのファンクションが各トランザクションで使用され、行が取得され、メッセージが表示されます。

例8-4のコードは、制限されたDBMS_AQ.DEQUEUE呼出しのような機能を実装します。ただし、機能は少なくなります。既存の機能(この場合、ファンクション・ベース索引)を使用して節約された開発時間が大きくなる場合があります。

例8-4 同時デキュー・トランザクション

表の作成:

DROP TABLE t;
CREATE TABLE t
  ( id             NUMBER PRIMARY KEY,
    processed_flag VARCHAR2(1),
    payload        VARCHAR2(20)
  );

表の索引の作成:

CREATE INDEX t_idx ON
  t( DECODE( processed_flag, 'N', 'N' ) );

表への移入:

INSERT INTO t
  SELECT r,
         CASE WHEN MOD(r,2) = 0 THEN 'N' ELSE 'Y' END,
         'payload ' || r
  FROM (SELECT LEVEL r FROM DUAL CONNECT BY LEVEL <= 5);

表の表示:

SELECT * FROM t;

結果:

ID P PAYLOAD
---------- - --------------------
         1 Y payload 1
         2 N payload 2
         3 Y payload 3
         4 N payload 4
         5 Y payload 5

5 rows selected.

1つ目のトランザクション:

DECLARE
  l_rec t%ROWTYPE;
  CURSOR c IS
    SELECT *
    FROM t
    WHERE DECODE(processed_flag,'N','N') = 'N'
    FOR UPDATE
    SKIP LOCKED;
BEGIN
  OPEN c;

  FETCH c INTO l_rec;

  IF ( c%FOUND ) THEN
    DBMS_OUTPUT.PUT_LINE( 'Got row ' || l_rec.id || ', ' || l_rec.payload );
  END IF;

  CLOSE c;
END;
/

結果:

Got row 2, payload 2

コンカレント取引:

DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
  l_rec t%ROWTYPE;
  CURSOR c IS
    SELECT *
    FROM t
    WHERE DECODE(processed_flag,'N','N') = 'N'
    FOR UPDATE
    SKIP LOCKED;
BEGIN
  OPEN c;

  FETCH c INTO l_rec;

  IF ( c%FOUND ) THEN
    DBMS_OUTPUT.PUT_LINE( 'Got row ' || l_rec.id || ', ' || l_rec.payload );
  END IF;

  CLOSE c;
  COMMIT;
END;
/

結果:

Got row 4, payload 4

関連情報:

エディショニング・ビューによるデータベース表のカバー

アプリケーションでデータベース表が使用されている場合、停止時間を最小限にする、または発生するさせないように、エディションベース再定義(EBR)を使用して、使用中のアプリケーションのデータベース・コンポーネントをアップグレードできるように各表をエディショニング·ビューで覆います。

エディション・ベースの再定義の詳細は、『Oracle Database開発ガイド』に関する項を参照してください。