Oracle Essbase計算スクリプトでは、if文を使用して条件がtrueの場合にコードを実行し、else文およびelse if文を使用して、以前に評価された条件がfalseの場合にテストする新しい条件をそれぞれ指定します。
if文およびelse if文を使用するコードを最適化するには、データの大部分を満たす条件を分析し、その条件の評価をコードの先頭に移動して、できるだけ早く実行されるようにします。
次のSample.Basicの計算スクリプトの例を見てみましょう(AccountとTimeが密です):
SET UPDATECALC OFF;
"SalesYTD"(
IF(@ismbr("Jan"))
SalesYTD" = "Sales";
Else
"SalesYTD"="Sales" + @prior("SalesYTD");
Endif
)
この場合、else条件の基準を満たすデータが90%を超えます。if条件の基準を満たすデータはわずか約10%です。else条件に@prior関数があるため、他のすべての月の前に1月を計算する必要があります。この計算を実行すると、合計経過時間は次のように報告されます:
Total Calc Elapsed Time for [IF.csc] : [0.203] seconds
この計算では、"SalesYTD"メンバーはセル・モードで計算されることに注意してください。つまり、1月はアウトライン内で他の月より前に出現するため、if条件文の順序に関係なく、最初に計算されます。
このようなスクリプトを最適化するには、次の例に示すように、文を並べ替え、最初の条件にNOT演算子を追加します:
SET UPDATECALC OFF;
"SalesYTD"(
IF(NOT(@ismbr("Jan")))
"SalesYTD" = "Sales" + @prior("SalesYTD");
Else
"SalesYTD"="Sales";
Endif
)
この場合、90%を超えるデータがif文の条件を満たしているため、前述の例に比べて計算にかかる時間は4分の1未満です。
Note:
この例では、正しい結果を得るために、式をアウトラインの順序で計算することが不可欠です(2月は1月の後に計算し、3月は2月の後に計算する必要があります)。順序が自動的に実行されない場合は、@calcmode(Cell)を使用して順序を強制できます。