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*/
)
データベース・アイテム
この例では、データベース・アイテムを使用すると、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. */
)