标识出要优化的步骤之后,编辑业务规则。确保为每一步指定了最佳逻辑和条件。
考虑下面的业务规则定义:计算两个 YTD 帐户,然后通过“产品”和“实体”维聚合各值:
SET UPDATECALC OFF; /* PASS 1 BEGINS*/ FIX ("BaseData","Plan","FY17", "FY17" "FY16") "BU Version_1"( IF(@ismbr("Jan")) "4110_YTD" = "4110"; "4120_YTD" = "4120"; "4130_YTD" = "4130"; "4140_YTD" = "4140"; "4150_YTD" = "4150"; Else "4110_YTD"="4110" + @prior("4110_YTD"); "4120_YTD"="4120" + @prior("4120_YTD"); "4130_YTD"="4130" + @prior("4130_YTD"); "4140_YTD"="4140" + @prior("4140_YTD"); "4150_YTD"="4150" + @prior("4150_YTD"); Endif) /* PASS 1 ENDS -- PASS 2 BEGINS*/ Agg("Entity","Product"); /* PASS 2 ENDS */ ENDFIX
在 Calculation Manager 中运行此规则(请参阅“标识需要进行规则优化的区域”)时,如果选择了仅显示执行,日志消息选项卡会显示一则类似如下的消息:
对日志文件中的信息进行分析后发现,99.995% 的执行时间(79.235 秒)都花在第 1 遍上,只有 0.005% 的时间花在第 2 遍上。
如果您取消选择仅显示执行,则将显示如下图所示的块、读取和写入信息:
上面的规则定义具有如下问题:
对“实体”和“产品”维没有使用 Fix,因此会强制在“实体”和“产品”维的所有级别上运行所有规则。
第 1 遍不必计算高级别。第 2 遍中的 Agg 函数会执行高级别计算,同时覆盖第 1 遍中完成的计算。
可以按如下所示对脚本进行优化:
SET UPDATECALC OFF; FIX ("BaseData","Plan","FY17") /* PASS 1 BEGINS*/ Fix(@LEVMBRS("Entity",0), @LEVMBRS("Product",0)) "BU Version_1"( IF(@ismbr("Jan")) "4110_YTD" = "4110"; "4120_YTD" = "4120"; Else "4110_YTD"="4110" + @prior("4110_YTD"); "4120_YTD"="4120" + @prior("4120_YTD"); Endif) ENDFIX /* PASS 1 ENDS -- PASS 2 BEGINS*/ Agg("Entity","Product"); /* PASS 2 ENDS */ ENDFIX
在 Calculation Manager 中运行已更新的规则(请参阅“标识需要进行规则优化的区域”)时,日志消息选项卡显示一则类似如下的消息:
对日志文件中的信息进行分析后发现,第 1 遍花费的执行时间相比上次运行所花费的时间减少了 15.901 秒。
如果您取消选择仅显示执行,则将针对第 1 遍显示如下图所示的块、读取和写入信息:
将块、读取和写入信息与优化前的类似数据进行比较后发现,业务规则的处理统计信息值整体下降。