機械翻訳について

Formulaパフォーマンスの向上

様々なアプローチを使用して、Formulaが読みやすく、使用しやすく、理解しやすく、効率的に処理されるようにします。

変数名と別名

簡潔でわかりやすい変数名を使用します。 データベース・アイテム名が長い場合は、別名を使用できます。 データベース・アイテム名の長さは、Formulaのパフォーマンスやメモリー使用量には影響しません。

入力文

ヒント: 可能なかぎり、データベース・アイテムではなくINPUTS文を使用することをお薦めします。 入力変数のためにデータベースにアクセスする必要はありません。そうすれば、給与計算が高速になります。

INPUTS文を使用しないFormulaの例を次に示します。

SALARY = SALARY_ANNUAL_SALARY / 12
RETURN SALARY

INPUTS文を効率的に使用する方法を次に示します。

INPUTS ARE ANNUAL_SALARY
SALARY = ANNUAL_SALARY / 12
RETURN SALARY

CHANGE_CONTEXTS文

ヒント: 必要な場合にのみCHANGE_CONTEXTS文を使用することをお薦めします。CHANGE_CONTEXTSを使用すると、データベースからデータベース・アイテム値が再度フェッチされる可能性があります。

他のCHANGE_CONTEXTSブロックからCHANGE_CONTEXTSをコールするかわりに、単一のCHANGE_CONTEXTS文を使用して複数のコンテキスト変更を実行できます。

たとえば、最初のFormulaは、2番目のFormulaより効率的な単一のCHANGE_CONTEXTS文を使用しています。

CHANGE_CONTEXTS(EFFECTIVE_DATE = l_eff_date, AREA1= 'California')
(
  /*Do something here*/
)
CHANGE_CONTEXTS(EFFECTIVE_DATE = l_eff_date)
(
CHANGE_CONTEXTS(AREA1 = 'California')
   (
    /*Do something here*/
   )
)

すでに設定されている可能性が高いコンテキストを、CHANGE_CONTEXTS文を使用して設定しないでください。

たとえば、個人情報を処理するFormulaには、通常はPERSON_IDコンテキストがすでに設定されています。 このコンテキストが設定されていない場合、GET_CONTEXTは値をフェッチしません。 GET_CONTEXTは、デフォルト値の-1のみを返します。 このコードでは何も行われません。

l_person_id = GET_CONTEXT(PERSON_ID, -1)
l_effective_date = GET_CONTEXT(EFFECTIVE_DATE, '0001-01-01 00:00:00)(DATE))

CHANGE_CONTEXTS(PERSON_ID = l_person_id, EFFECTIVE_DATE = l_effective_date)
(
  /*Do something here*/
)

データベース・アイテム

ヒント: 必要なデータベース・アイテムのみをFormulaに保持することをお薦めします。 絶対に必要な場合を除き、Formulaでデータベース・アイテムを参照しないでください。 不要なデータベース呼出しが発生する原因となるデータベースがFormulaに含まれている場合があります。 その結果、Formulaの効率が影響を受けます。

この例では、データベース・アイテムを使用すると、AGEのデータベース・フェッチが常に発生します。

S = SALARY
A = AGE
IF S < 20000 THEN
IF A < 20 THEN
  TRAINING_ALLOWANCE = 30
ELSE
  TRAINING_ALLOWANCE = 0

この例では、給与が20000未満の場合にのみ、データベース・アイテムを使用してAGEをフェッチします。

IF SALARY < 20000 THEN
IF AGE < 20 THEN
  TRAINING_ALLOWANCE = 30
ELSE
  TRAINING_ALLOWANCE = 0

HCM抽出のデータベース・アイテム

一部のデータベース・アイテムは、HCM抽出レポート専用です。 これらのデータベース・アイテムは大量のデータを返すため、Formulaで使用しても効率的に取得できません。

たとえば、HCM抽出データベース・アイテムでは、アプリケーション上のすべての従業員の情報、または特定の従業員の雇用開始以降のすべての情報が取得されます。 レポートでは大量のデータが処理されるため、このデータの取得はレポート作成に適しています。 Formulaでは通常、特定のケースに限定された少量のデータを処理します。 HCM抽出では、返されるデータを制限するために条件を追加できますが、Formulaでは追加できません。

これらのデータベース・アイテムを使用すると、適切なデータを取得するためにより複雑なFormulaが必要になり、データ量が多くなるために式のパフォーマンスが極端に低下します。 たとえば、配列データベース・アイテムPER_EXT_ALL_PHONE_AREA_CODEは、有効日時点のすべての電話市外局番を返します。 PER_EXT_ALL_PHONE_PERSON_IDおよびPER_EXT_ALL_PHONE_TYPEとともに使用すれば、個人の自宅電話の市外局番の取得は可能です。

しかし、PER_PER_HOME_PHONE_AREA_CODEデータベース・アイテムを使用して自宅電話の市外局番を取得すれば、Formulaを単純化してパフォーマンスを向上できます。 PER_PER_HOME_PHONE_AREA_CODEは、PERSON_IDおよびEFFECTIVE_DATEのコンテキストを使用してデータを取得します。 PER_EXT_ALL_PHONE_AREA_CODEは、EFFECTIVE_DATEのコンテキストのみを使用します。

Whileループ

タスクの完了直後にWHILEループを抜けるには、EXIT文またはループ条件の変更を使用します。 たとえば、探していた単一のアイテムがすでに見つかった場合は、処理を続行しません。

Formulaロギング

Formulaロギングは、Formulaの開発時に実装時に役立ちます。 問題の診断にも役立ちます。 サポート・サービス・リクエストによってログに記録された問題を調査する場合、Oracleはログ情報を要求することがあります。

ロギングは非常に役立ちますが、ロギング・プロセスはパフォーマンスに影響し、一般的に処理が遅くなる可能性があります。 ロギング・プロセスで使用されるリソースを待機している他のプロセスでは、完了までに時間がかかるか、起動に遅延する場合があります。

目的が提供されたら、不要なロギング文を削除することをお薦めします。 診断目的でロギング文を保持する必要がある場合は、次のように条件付きで実行することをお薦めします。
debug = 0 
if (debug = 1) then 
( 
   /* Log statements here. */ 
)
ロギングが必要な場合は、debug = 1を設定し、Formulaを再コンパイルします。
ノート: 終了したら、必ずロギングを無効にしてください。