IF文でNOTを使用したEssbase計算スクリプトの最適化

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)を使用して順序を強制できます。