在 Oracle Essbase 計算指令碼中,您會使用 if
陳述式在條件為 true 時執行程式碼,使用 else
和 else if
陳述式來指定當先前評估的條件為 false 時要測試的每個新條件。
您可以將使用 if
和 else 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)
來強制排序。