通过在 if 语句中使用 NOT 运算符来优化 Essbase 计算脚本

Oracle Essbase 计算脚本中,如果条件为 true,则使用 if 语句执行代码,如果前面求值的条件为 false,则使用 elseelse if 语句指定要测试的各个新条件。

您可以优化使用 ifelse if 语句的代码,方法是分析符合大部分数据的条件,然后将对该条件的求值移至代码开头,以便尽早执行代码。

考虑 Sample.Basic 的以下计算脚本示例,其中帐户和时间是密集维:

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

在此示例中,超过 90% 的数据满足 else 条件的评判标准。只有大约 10% 的数据满足 if 条件的评判标准。由于 else 条件中的 @prior 函数,必须在所有其他月份之前计算 January。运行此计算时,报告的总用时如下:

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

在此计算中,请注意 "SalesYTD" 成员是在单元格模式下计算的,这意味着无论 if 条件语句的顺序如何,都会先计算 January,因为它出现在大纲中其他月份之前。

您可以通过对语句重新排序并向第一个条件添加 NOT 运算符来优化此类脚本,如以下示例中所示:

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

此示例与前一个示例相比,计算用时不到原来的四分之一,因为超过 90% 的数据满足 if 语句中的评判标准。

Note:

在此示例中,必须按大纲顺序(必须在 January 后面计算 February,在 February 后面计算 March,依此类推)计算公式才能获得正确结果。如果未自动实现,您可以使用 @calcmode(Cell) 强制设置顺序。