最佳作法

以下是一些設計商業規則的最佳作法,包含使用適當的命令、使用語法、最佳化準則、建議的計算層級、聚總選項和除錯方法。

環境設定值

使用指示商業規則如何執行計算的命令時,請考慮下列最佳作法。
  • SET UPDATECALC OFF 會關閉智慧型計算,這是使用跨維度運算子而且可能有多位使用者存取相同資料區塊組合之商業規則的最佳作法。使用此命令是多位使用者寫入至資料庫之應用程式的最佳作法。如果您使用智慧型計算,則請確定它產生預期結果。
  • SET AGGMISSG OFF 應該針對版本為標準目標或使用非分葉資料區的應用程式進行設定,而且無法在計算期間予以排除。

    如果應用程式設計已設定在層級 0 載入資料的「標準自下而上式」版本,則使用 SET AGGMISSG ON 十分有用。

  • SET NOTICESET MSG SUMMARY 只應該用於開發環境,以進行個別計算分析。針對生產環境,或在計算分析完成之後,應該移除這些命令。
  • 在 FIX 陳述式中包含 Run Time Prompts (RTP) 而不計算空集合時,應該會使用 SET EMPTYMEMBERSETS ON。這可在集合是空的時防止對所有成員執行計算。

最佳化和效能考量

  • 在商業規則中使用範本,以避免程式碼區段重複,並善加使用 RTP。
  • 複查每個計算內動態計算成員的相依關係。可能的話,請變更計算以避免包含重複使用的動態計算,或移除動態計算。
  • 使用 FIX 和 IF 陳述式來聚焦您的計算,確保只計算必要資料。
  • 除非您要看到零,否則請避免建立 0 (零) 資料結果;例如,針對庫存層級。這將建立區塊,而區塊包含在所有 FIX 和 IF 陳述式中,而且會進行計算。可能的話,請在資料載入時移除零,或防止在商業規則中建立零。
  • 在用來檢查條件是否存在的 IF 陳述式內,請嘗試避免布林邏輯。例如,將
    IF (("Budget" ==#missing) OR ("Budget" ==0))
    取代為下列內容,這樣會提供相同的結果,但請避免使用布林邏輯:
    IF ("Budget" +1==1) or IF (Budget/Budget ==#missing)
  • 可能的話,請先執行密集計算,再執行稀疏計算。密集計算不會建立封鎖,但稀疏計算會。執行聚總時;例如,若要取得總計以進行配置計算,請確定您只聚總該配置計算所需的資料區段。
  • 最小化資料庫上的階段。
  • 避免遞迴公式。過多的遞迴可能會產生效能問題,而且您可能需要清除值,才能產生一致的結果。

避免遞迴錯誤

遞迴錯誤的主要原因是欄標頭中未包含且並行計算的密集動態計算 (包含在 FIX 陳述式中未包含的成員中)。如果一些其他動態計算成員的公式在 FIX 陳述式中包含密集成員,則發生遞迴。如果遞迴層級超過 128,則會發生遞迴錯誤。

排除動態計算成員的主要原因是要改善效能。此外,排除動態計算成員可協助您避免遞迴錯誤,方法是確定匯出使用壓縮區塊,而非展開的區塊。也可能避免遞迴錯誤,方法是變更用作欄標頭的密集維度,而針對欄標頭,會個別計算 FIX 陳述式所定義的每欄。不會發生遞迴,因為會忽略 FIX 陳述式中未包含的其他密集動態計算,以允許成功執行規則。

註:

如果匯出檔包含的欄超過 256,則您無法變更密集維度欄標頭。

例如,如果您使用下列計算指令碼,則可能會收到 Cannot calculate. Essbase Error(1200494): Error executing formula for [Yield%] (line 15): Recursion limit [128] reached 錯誤:

SET DataExportOptions
     {
     DATAEXPORTCOLFORMAT ON;
     DATAEXPORTDIMHEADER ON;
     DATAEXPORTDRYRUN OFF;
     DataExportRelationalFile OFF;
     DataExportNonExistingBlocks OFF;
     DataExportLevel ALL;
     DATAEXPORTCOLHEADER "Period";
     DATAEXPORTOVERWRITEFILE ON;
     DataExportDynamicCalc ON;
     };

FIX ("Yield%",@Relative("Change Over",0),@Relative("Currency",0),@Relative("Entity",0),@Relative("Product",0),@Relative("CostCentre",0),"Jan","Actual_Total",@Relative("View",0),"Working","Fy20")

DATAEXPORT "File" "," "/u03/inbox/data/ExportDataFile.txt"  "#";
 

若要避免錯誤,請將 DataExportDynamicCalc ON; 變更為 DataExportDynamicCalc OFF;,以關閉「動態」選項。

使用 FIX 陳述式

  • FIX 陳述式用來聚焦商業規則 (盡可能將所計算的區塊數目保持最少),確定您只計算必要區塊。
  • FIX 陳述式建議用於稀疏維度,因為它會減少計算所需的區塊數目。
  • 如果應用程式設計已設定自下而上式版本,則請確定對所有維度的層級 0 執行計算。
  • 可能的話,請在稀疏維度上使用外部 FIX 陳述式,並在密集維度上使用內部 IF 陳述式。
  • 所有 FIX 陳述式都應該包含所有維度的成員,但計算內的維度除外。如果排除維度,則會包含該維度的所有成員。這可能是不必要的。
  • 可能的話,請巢狀處理 FIX 陳述式,以減少資料庫階段數目。每個完整 FIX 陳述式都需要資料庫上有階段。例如,您可以將外部 FIX 用於 Version、Scenario 及在整個商業規則都是靜態的任何其他維度選取項目。
  • 針對與 Web 表單相關聯的商業規則,利用選取的頁面以及 FIX 陳述式中的 POV 成員來減少所計算區塊數目。

使用 IF 陳述式

  • IF 陳述式可以用於成員公式;FIX 則否。
  • IF 陳述式應該用於 FIX 陳述式內,以減少要存取的區塊數目。IF 陳述式會將 FIX 內的所有區塊都帶入記憶體。
  • 可能的話,請在稀疏維度上使用外部 FIX 陳述式,並在密集維度上使用內部 IF 陳述式。
  • 可能的話,請使用 ELSE,而非 NOT 與 ELSEIF 的組合,以避免在計算期間對成員值進行不必要的分析。如果 ELSE 不是必要陳述式,則請不要使用該陳述式。
  • 複查 Calc Member Block 選項,以判斷您是否可以使用沒有動態計算相依關係的稀疏成員。
  • 排序 IF 陳述式 (可能的話),而大多數的案例都符合區塊中的第一個 IF。請在 IF 內使用 NOT,來確保此狀況 (可能的話)。

    請考慮使用下列指令碼,其假設 SalesYTDSample.BasicRatios 的子項 (其中科目時間為密集)。

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

    在此範例中,雖然資料的第 11/12 項符合 ELSE 條件,但只有資料的第 1/12 項才符合 IF 條件。此外,SalesYTD 成員是以「儲存格」模式進行計算,表示會先計算一月 (因為它出現在大綱中的第一個),而不管 IF 順序為何。您可以在 IF 陳述式中使用 NOT,以最佳化此指令碼,如下列範例所示:

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

區塊計算

  • 使用 RTP,確定只有必要資料才包含在商業規則中。
  • 只聚總或計算每個計算階段所需的資料,確定計算中所含的區塊數目盡可能地少 (只要可能)。

計算層級

  • 如果應用程式設計已設定自下而上式版本,則請確定對所有維度的層級 0 執行計算。
  • 如果只有針對核准程序才是必要項目,則請在「BSO 計畫類型」中包含聚總。請將所有其他聚總都移至「ASO 計畫類型」。
  • 只要可能,計算中所含的區塊數目請盡可能地少。

語法考量

  • 如果用於整個維度,則請一律使用 @LEVMBRS,而非 @RELATIVE
  • 使用 @CHILDREN,而非 @RELATIVE (適用時)。
  • 如果您只要從 FIX 陳述式排除一些成員,則請使用 @REMOVE@LEVMBRS
使用 Planning 中所儲存的日期來執行計算

Planning 可讓您輸入日期值。例如,使用 MM/DD/YYYY 格式,開始日期可能輸入為 11/01/2019,而結束日期可能輸入為 06/01/2020。Essbase 會將日期格式值儲存為數值。例如,先前的開始日期儲存為 20191101,而結束日期儲存為 201200601。您可以使用 Essbase 函數 (例如,@ROUND@INT@TRUNCATE 函數) 來計算任何開始日期與結束日期之間的月份數。下列範例顯示如何使用 @ROUND 函數來計算開始日期與結束日期之間的月份數:

  1. 計算結束日期年份與開始日期年份之間的月份數,如下所示:
    (@ROUND ("End Date",-4) - @ROUND ("Start Date",-4))/10000*12
    此計算 (20200000 – 20190000)/10000 *12 的結果為 12。
  2. 計算結束日期年份開始與結束日期之間的月份數,並加上它。
    (@ROUND ("End Date",-2) - @ROUND ("End Date",-4))/100
    計算 (20200600 – 20200000)/100 的結果為 6。
  3. 計算開始日期年份開始與開始日期之間的月份數,並減掉它。
    (@ROUND ("Start Date",-2) - @ROUND ("Start Date",-4))/100
    計算 (20191100 – 20190000)/100 的結果為 11。
  4. 將先前的步驟結合到一個公式 (12+6-11),以計算開始日期與結束日期之間的月份數 (7)。
    (((@ROUND ("End Date",-4) - @ROUND ("Start Date",-4))/10000*12) + 
    ((@ROUND ("End Date",-2) - @ROUND ("End Date",-4))/100)-
    ((@ROUND ("Start Date",-2) - @ROUND ("Start Date",-4))/100))
使用 @CURRMBR 函數

@CURRMBR 函數可傳回目前所計算維度成員的名稱,特別適用於限定和管理複雜計算。不過,您必須考慮其效能影響。

在稀疏維度上使用 @CURRMBR 函數時,不會影響效能,因為區塊只會對應至一個稀疏維度成員。不過,用於密集維度時,此函數的效能會變慢,因為它會在區塊層級執行計算,而非儲存格層級。因此,此函數會計算所有密集維度成員,即使查詢中沒有特定密集維度成員也是一樣。因此,請謹慎地搭配使用此函數與密集維度。

此外,用於密集維度時,如果搭配使用 @CURRMBR 函數與 @CONCATENATE 這類其他函數,則可能會產生非預期的結果或錯誤。例如,如果查詢中的動態計算成員包含公式 "Actual"->@MEMBER(@CONCATENATE(@NAME (@CURRMBR ("Account")),"_Total")),而且 Account 維度為稀疏,則只要查詢中的科目產生有效的大綱成員,就會執行查詢,而不發生錯誤。不過,如果 Account 維度為密集,則查詢會導致下列錯誤,即使查詢中的科目產生有效的大綱成員也是一樣。

Error executing formula for [member name] (line 0): attempt to cross a null @ member in function [@X]

會產生此錯誤,因為 @CURRMBR 函數在區塊層級進行計算,因此會計算密集區塊中的所有科目。並非區塊內的所有科目都會產生有效的大綱成員,進而導致先前的錯誤訊息。如需 @CURRMBR 函數的詳細資訊,請參閱 Oracle Essbase Technical Reference (僅英文版) 中的 @CURRMBR

使用區塊模式和儲存格模式

  • 使用在區塊內群組儲存格並同時計算的區塊模式,通常較為快速,但必須仔細考量資料相依關係。例如,應該以儲存格模式計算 SalesYTD = CurMth + PriorMth,因此會依大綱順序計算每個月。
  • 在儲存格模式,會以大綱中的密集維度順序來循序計算每個儲存格,而且通常會比區塊模式還要慢。
  • 使用 @CALCMODE 手動控制使用區塊還是儲存格模式。
  • 使用除錯模式應用程式日誌來驗證計算模式。如果以區塊模式執行計算,則不會顯示訊息。以儲存格模式執行計算時,會顯示日誌訊息。

建立區塊和區塊大小的建議

最佳效能的建議區塊大小介於 8 KB 與 200 KB 之間。若要保持最佳 BSO 區塊大小,Oracle 建議您只將用於規劃和預測的科目新增至 BSO 立方體。可能的話,請使用 ASO 立方體進行報告,方法是將所有報告科目都新增至 ASO 立方體。此外,若要簡化區塊大小,Oracle 建議將密集維度中為其子項聚總的所有上層都設為動態計算 (不安全) 或僅標籤。

一般會對下列動作建立區塊:

  • 資料載入
  • DATACOPY
  • 稀疏計算,例如,AGG or SparseMember = X * X/X;

稀疏計算會在下列時機觸發:

  • 稀疏成員位於等號 (=) 的左側。
  • 公式位在稀疏計算成員區塊內;例如,"Budget"("Sales" = "Sales"->"Actual" * 0.95;),假設 Scenario 為稀疏,而 Measures 為密集。

使用計算命令 SET CREATEBLOCKONEQSET CREATENONMISSINGBLK 或計算函數 @CREATEBLOCK,可以建立區塊。

Oracle 建議謹慎地使用這些設定值,並將它們用於緊密 FIX 陳述式內。測試以查看您是否可以變更所執行計算的類型來避免使用這些陳述式。

面對問題時,請先判斷它是否與區塊建立有關,再使用這些計算命令或函數。您可以將零 (0) 提交至目標區塊,然後重新執行計算,以判斷問題是否與區塊建立有關。

在商業規則開發中,測試可能造成區塊建立問題的規則時,請一律清除和重新載入資料 (而非提交 #missing 或是執行 clearblockcleardata 指令碼)。

使用由下至上和由上至下計算

  • 新增計算函數 @CALCMODE(BOTTOMUP) 或計算命令 SET FRMLBOTTOMUP 只計算現有區塊 (BOTTOMUP),而非潛在區塊 (TOPDOWN)。
  • 因為 TOPDOWN 計算會計算具有該成員的所有潛在資料區塊,所以請移除稀疏維度內任何不相關的成員。
  • 使用 BOTTOMUP 完整測試計算,確定在使用 @CALCMODE 時正確地建立區塊。
  • 使用 BOTTOMUP 計算時,請清除並重新執行計算來判斷已正確地建立所有區塊,以完整測試計算。
  • 使用除錯模式應用程式日誌來驗證計算模式。如果以 BOTTOMUP 執行計算,則不會顯示訊息。如果以 TOPDOWN 執行計算,則會顯示日誌訊息。

聚總

  • 應該排序稀疏維度聚總,而順序是從建立最少區塊的維度開始,再到建立大部分區塊以盡可能保留最少區塊數目的維度 (只要可能)。
  • 不要建立使用者商業規則來聚總整個稀疏維度。
  • 只將進行報告所需的聚總移至「ASO 計畫類型」。
  • 只聚總規劃核准程序所需的資料。

使用 AGG,而非 CALC DIM 計算命令

  • CALC DIM 會執行任何成員公式。
  • CALC DIM 會聚總密集或稀疏維度。
  • AGG 會根據大綱結構來聚總。
  • AGG 不會執行成員公式。
  • AGG 只會聚總稀疏維度。
同時測試 AGG 和 CALC DIM,因為根據涉及計算的聚總層級,效能可能會不同。從所有聚總,排除較高層級上具有動態計算的維度。只聚總必要資料。

使用 SET CALCPARALLEL 和 FIXPARALLEL 計算命令

  • 針對可能並行執行規則的多使用者應用程式,以循序模式執行商業規則。
  • 只在批次計算中,完整稀疏維度聚總周圍使用 SET CALCPARALLEL
  • 不建議平行計算小型指令碼 (例如,執行時間少於 20 秒的指令碼),因為建立平行化的負擔可能超過優點。
  • 一律測試 SET CALCPARALLEL,確定它仍然有益。序列計算或平行化層級較低的計算有時可產生較佳的結果。
  • 測試以判斷 FIXPARALLEL 所提供的結果是否優於 SET CALCPARALLEL 以除錯模式使用 Calculation Manager 來複查日誌。
  • 使用 SET CALCPARALLELFIXPARALLEL 時,請一律考慮使用者並行。

如需詳細資料,請參閱 中的FIXPARALLEL...ENDFIXPARALLEL Oracle Essbase Technical Reference (僅英文版)

Planning 中的計算上啟用混合立方體的影響

如果您使用常數而不是來自其他成員的資料值 (例如,就二月而言,月份所含天數 = 28) 來指派計算中的值,請複查已啟用混合立方體之 Planning 業務程序中的計算結果。

已啟用混合立方體之 Planning 業務程序中的計算結果可能與在未啟用混合立方體之業務程序中觀察到的計算結果不同。計算結果的差異可能歸因於已啟用混合立方體之 Planning 業務程序所使用的組態會忽略任何只根據常數來指派資料值的公式。若要解決此問題,請將 @CreateBlock into the formula on a dense element of the formula.當 @CreateBlock 位於密集維度上時,這項新增會同時為所有其他密集元素建立區塊。此外,請針對每個 IF 陳述式使用 ELSE 陳述式,以確保已建立所有必要區要。

如需有關在 Oracle Enterprise Performance Management Cloud 中使用 Essbase 的資訊,請參閱管理員適用的 Oracle Enterprise Performance Management Cloud 快速入門中的關於 EPM Cloud 中的 Essbase