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