Essbase 公式优化
要优化计算和查询的 Essbase 块存储公式处理,您可以通过使用合并而不是计算来避免公式,在可能的情况下使用更简单的公式,采取措施调整复杂公式的性能,或切换到混合模式。
通过在多维数据集大纲中仔细使用公式,可以显著提高计算性能。例如,您可以将公式放在数据库大纲中的成员上,而不是将公式放在计算脚本中,从而提高计算性能。请参阅为块存储多维数据集开发公式。
以下各节讨论了如何在非混合模式(块存储多维数据集)下处理影响计算性能的公式问题。
要进行混合模式优化,请改为参阅 Hybrid Mode for Fast Analytic Processing 。
Essbase 成员合并
与使用公式计算 Essbase 数据值相比,使用多维数据集大纲汇总这些数据值的效率更高。
例如,将成员 100-10、100-20 和 100-30 合并到成员 100(如下所示)比将以下公式应用于成员 100 更有效率:
100-10 + 100-20 + 100-30图 34-1 合并示例

请参阅成员合并示例。
简单的 Essbase 成员公式
如果 Essbase 公式很简单,则会影响块存储计算性能,而不是复杂的公式。块大小也是性能的一个因素。更简单的公式是不使用跨维引用、范围函数、财务函数或关系函数的公式。
如果使用简单的公式,并且块大小不是异常大的,则可以将公式放置在稀疏维或密集维的成员上,而不会显著影响计算性能。块大小越大,简单公式对计算性能的影响就越大。
例如,一个简单的公式是比率或百分比,并且满足以下要求:
-
不引用来自不同维(稀疏或密集)的值。例如,简单公式不能引用“产品”->“一月”。
-
不使用范围函数。例如,简单公式不能使用 @AVGRANGE、@MAXRANGE、@MINRANGE 或 @SUMRANGE。
-
不使用关系或财务功能。例如,简单公式不能使用 @ANCESTVAL、@NEXT、@PARENTVAL、@SHIFT、@ACCUM 或 @GROWTH。
复杂的 Essbase 成员公式
如果 Essbase 公式很复杂,则会影响块存储计算性能,而不会影响较简单的公式。要优化复杂的公式,请在密集的维度中应用它们,增加密度,并使用 FIX 缩小范围。
如果使用复杂公式,则可以通过应用以下准则来提高性能:
-
如果可能,将公式应用于密集维中的成员。如果可能,请确定是否可以将自上而下的计算更改为自下而上(请参阅大纲中稀疏维的公式)。
-
在计算脚本中使用 FIX 命令,仅计算所需的数据块。
-
增加数据库的密度(现有数据块与可能数据块的比率)。
复杂公式是满足以下任一要求的公式:
-
引用不同维(稀疏或密集)中的成员;例如,“Product(产品)”>“Jan(一月)”。
-
使用一个或多个范围函数,例如 @AVGRANGE、@MAXRANGE、@MINRANGE 或 @SUMRANGE。
-
使用关系或财务函数;例如 @ANCESTVAL、@NEXT、@PARENTVAL、@SHIFT、@ACCUM 或 @GROWTH。
当应用于稀疏维成员时,复杂的公式会产生更多的计算开销,从而降低性能。出现此问题是因为存在复杂公式需要 Essbase 对所有可能的数据块以及与具有复杂公式的成员相关的所有现有数据块执行计算。稀疏维成员上存在关系或财务功能会导致 Essbase 对所有块(包括现有块)执行计算,从而增加开销。
因此,包含关系或财务职能的复杂公式会产生比不包含关系或财务职能的复杂公式更大的间接费用增加。
以下两个示例说明了复杂的公式开销:
-
如果立方有 90 个现有数据块和 100 个潜在数据块,则复杂公式的开销不大,可读取和写入值的额外块不超过 10 个。
-
如果立方有 10 个现有数据块和 100 个潜在数据块,则开销将是没有复杂公式(取决于大纲结构和其他因素)的十倍,多达 90 个额外块可供读取和写入。
在所有情况下,现有数据块与可能数据块的比率越低,计算性能开销越高,性能越慢。
大纲中稀疏维的公式
要优化大型 Essbase 块存储多维数据集大纲中稀疏维上复杂公式的计算,可以强制自下而上计算公式。
可以使用 SET FRMLBOTTOMUP 计算命令优化大型数据库大纲中稀疏维中的公式计算。使用此命令,可以强制对稀疏成员公式执行自下而上的计算,否则将自上而下进行计算。请参阅自下而上和自上而下计算。
通过对自上而下的公式强制执行自下而上的计算,可以更高效地使用 CALC ALL 和 CALC DIM 命令。查看 SET FRMLBOTTOMUP 计算命令和 CALCOPTFRMLBOTTOMUP 配置设置的讨论。
稀疏维中分配给成员的常量值
如果将常量分配给稀疏维中的成员,则 Essbase 会自动为包含该成员的稀疏维成员的每个组合创建一个数据块。要限制块创建,可以使用 FIX。
例如,假定成员或计算脚本公式包含以下表达式:
California = 120;在此公式中,加利福尼亚是稀疏维中的成员,120 是常数值。Essbase 会自动为 California 创建所有可能的数据块,并将值 120 分配给所有数据单元格。可以创建数千个数据块。要提高性能,请创建不创建不必要值的公式。
要将稀疏维中的常量仅分配给需要值的交叉点,请使用类似于以下示例的方式使用 FIX:
FIX(Colas,Misc,Actual)
California = 120;
ENDFIX在此示例中,Colas 是稀疏维 Product 的成员;Actual 是密集维 Scenario 的成员;Misc 是密集维 Measures 的成员。值 120 分配给加利福尼亚的任何交集(在“市场”维中)、实际值(在“方案”维中)、杂项(在“度量”维中)、Colas(在“产品”维中)和“年”维中的任何成员,因为脚本中未指定“年”的特定成员。
由于 Sample Basic 仅包括两个稀疏维,因此此示例仅影响一个块。如果存在更多稀疏维,则 Essbase 将确保稀疏维与 California 和 Colas 的所有组合的数据块,并在必要时创建块。在新块中, Essbase 将“度量”和“方案”值(值 120 除外)设置为 #MISSING。
稀疏维中分配给成员的非常量值
要在为稀疏维的成员分配非常量值时临时阻止意外创建块,可以在 Essbase 计算脚本中使用 SET CREATEBLOCKONEQ OFF 命令。
如果将非常量值分配给稀疏维的成员,将基于“创建方程式块”设置创建块。"Create Blocks on Equations" 设置在数据库级别定义为数据库属性。请参阅非常量值。
在计算脚本中,可以暂时覆盖“在方程式上创建区块”设置。当 West 没有值并且启用了“Create Blocks on Equations(在方程式上创建块)”时,请考虑以下计算的影响:
West = California + 120;可以为与 West 的所有稀疏成员交叉点创建不需要的块,即使对于 West 的所有子项,对应的块值为 #MISSING。尤其是在大型数据库中,创建和处理不需要的块需要额外的处理时间。
要在为稀疏维的成员分配非常量值时控制块的创建,请使用 SET CREATEBLOCKONEQ ON | OFF 计算命令,如以下脚本所示:
FIX (Colas);
SET CREATEBLOCKONEQ OFF
West = California + 120;
SET CREATEBLOCKONEQ ON
East = “New York” + 100;
ENDFIX由于在脚本的开头禁用了“创建方程式块”设置,因此仅当 West 的子项存在值时,才会创建 West 块。之后,由于启用了“在方程式上创建块”设置,因此将创建 East 的所有块。
注意:
使用 SET CREATEBLOCKONEQ 仅在执行包含此命令的计算脚本期间影响块的创建。此命令不会更改“创建方程式上的块”的整体数据库设置。
成员公式中的跨维运算符
设计 Essbase 块存储成员公式时,使用方程式左侧的跨维运算符 ( -> ) 或密集维上的方程式时应谨慎。
方程式的左侧
为了提高计算脚本的性能,请在计算脚本中使用 FIX 来限定公式的使用,而不是在方程式左侧包含跨维运算符的公式。
例如,假设要将 Sample.Basic 中的 Jan -> Sales 值增加 5%。要通过仅计算成员的相关组合来提高性能,请使用 FIX 命令:
FIX(Jan)
Sales = Sales * .05;
ENDFIX使用 FIX 命令, Essbase 仅为指定成员组合(在本例中为包括 Jan 的组合)计算公式。
将此技术与使用较慢的跨维运算符方法进行比较。对于前面的示例,将以下公式放在数据库大纲中的 Sales 成员身上:
Sales(Sales -> Jan = Sales -> Jan * .05;)当 Essbase 循环使用数据库时,它会计算每个成员组合的公式,这些成员组合包括标记为时间的维(Jan、Feb、Mar 等)中的成员,尽管只需要计算 1 月的组合。
请参见 Use the FIX Command 。
密集维中的方程式
在密集维的方程式中使用跨维运算符时,如果两个条件都适用,则 Essbase 不会自动创建所需的块:
-
结果值来自密集维。
-
操作数或操作数来自稀疏维。
您可以使用以下技术创建块并避免性能问题。
-
确保结果成员来自稀疏维,而不是来自密集维。在此示例中,结果成员 Budget 来自稀疏维:
FIX(Sales) Budget = Actual * 1.1; ENDFIX FIX(Expenses) Budget = Actual * .95; ENDFIX -
使用 DATACOPY 计算命令创建并计算所需的块。请参阅使用 DATACOPY 复制现有块。
-
使用包含密集成员方程式的成员公式:
FIX(Sales, Expenses) Budget (Sales = Sales -> Actual * 1.1; Expenses = Expenses -> Actual * .95;) ENDFIX
管理公式执行级别
通过配置 CALCLIMITFORMULARECURSION,可以防止过度循环递归 Essbase 公式。
块存储大纲中的公式可以相互依赖,从而导致在一个或多个块内嵌套执行公式。此类公式称为递归公式。有时,递归公式会导致大型或无休止的循环,从而导致服务器异常终止。
为了避免异常终止,您可以使用 CALCLIMITFORMULARECURSION 配置设置来停止超过默认执行级别的公式执行。