在 IF 陳述式中使用 NOT 將 Essbase 計算指令碼最佳化

Oracle Essbase 計算指令碼中,您會使用 if 陳述式在條件為 true 時執行程式碼,使用 elseelse if 陳述式來指定當先前評估的條件為 false 時要測試的每個新條件。

您可以將使用 ifelse if 陳述式的程式碼最佳化,方法是分析符合您大部分資料的條件,然後將該條件的評估移至程式碼開頭,以便使其儘早執行。

請思考一下以下的 Sample.Basic 計算指令碼範例,其中 Accounts 和 Time 為密集維度:

SET UPDATECALC  OFF;
"SalesYTD"(
    IF(@ismbr("Jan"))
        SalesYTD" = "Sales";
Else
        "SalesYTD"="Sales" + @prior("SalesYTD");
Endif
)

在此案例中,超過 90% 的資料符合 else 條件的準則。只有大約 10% 的資料符合 if 條件的準則。由於 else 條件中有 @prior 函數,因此一月的計算順序必須在所有其他月份之前。執行此計算時,經過的總時間會回報為:

Total Calc Elapsed Time for [IF.csc] : [0.203] seconds

在此計算中,請注意,"SalesYTD" 成員是以「儲存格」模式進行計算,這意謂著不論 if 條件陳述式的順序為何,都會先計算一月 (因為它在大綱中出現在其他月份之前)。

您可以將這類指令碼最佳化,方法是重新排序陳述式並將 NOT 運算子新增至第一個條件,如以下範例所示:

SET UPDATECALC  OFF;
"SalesYTD"(
    IF(NOT(@ismbr("Jan")))
        "SalesYTD" = "Sales" + @prior("SalesYTD");
Else
        "SalesYTD"="Sales";
Endif
)

與先前的範例相比,在此情況下,計算花費的時間不到 1/4,因為超過 90% 的資料符合 if 陳述式中的準則。

Note:

在此範例中,必須依照大綱順序 (二月的計算順序必須在一月之後、三月在二月之後,依此類推) 計算公式,才能夠獲得正確的結果。如果未自動依此方式執行,您可以使用 @calcmode(Cell) 來強制排序。