两遍计算
双遍计算可以适用于必须计算两次才能生成正确值的成员公式。可以将帐户维成员标记为双遍,以提高某些块存储 Essbase 应用程序的性能。
注意:
请勿对混合模式多维数据集使用两遍计算。仅使用解决顺序。
对于某些应用程序,您可以通过在大纲中将帐户维成员标记为两遍来提高性能。但是,数据与计算需求的组合可能需要使用计算脚本来计算公式两次,而不是双遍标记,以保持准确性。
Essbase 尽可能在块级别计算双遍公式,同时计算主公式。然而,在某些情况下,需要额外的计算通行证。
Essbase 应如何计算双遍公式取决于时间和帐户维的密集稀疏配置。
双遍计算示例
考虑利润百分比所需的此计算:
Profit % = Profit % Sales假设下表显示“度量”和“年”作为密集维的数据块的子集。度量标记为帐户,年标记为时间。已关闭 AGGMISSG 配置设置(默认值)。
数据值已加载到输入单元格中。Essbase 按该顺序计算数字 1 到 7 显示的单元格。例如,首先计算利润百分比 -> 一月;利润百分比 -> Qtr1 具有多个合并路径。
表 34-5:“双遍”计算示例:数据和计算顺序
| 度量 -> 年 | Jan | Feb | 三月 | Qtr1 |
|---|---|---|---|---|
|
Profit |
75 |
50 |
120 |
5 |
|
销售 |
150 |
200 |
240 |
6 |
|
利润百分比 |
1 |
2 |
3 |
4、7 |
注意:
有关单元格计算顺序如何依赖于多维数据集配置的信息,请参阅单元格计算顺序。
Essbase 使用此计算顺序:
-
Essbase 计算公式
Profit % Sales:“利润百分比”->“一月”,“利润百分比”->“二月”,“利润百分比”->“三月”,“利润百分比”->“季度 1”(上面的第 1、2、3、4 个)。 -
Essbase 通过添加“一月”、“二月”和“三月”(上面的 5 和 6)的值来计算“利润”->“季度 1”和“销售”->“季度 1”。
-
Essbase 通过添加“利润百分比”->“一月”、“利润百分比”->“二月”和“利润百分比”->“三月”(上面的 7)的值来计算“利润百分比”->“季度 1”。此百分比加法将生成值 125%,但结果不正确。
表 34-6:双遍计算示例:结果不正确
衡量标准/年度 Jan Feb 三月 Qtr1 Profit 75 50 120 245 (5) 销售 150 200 240 590 (6) 利润百分比
50% (1)
25% (2)
50% (3)
0% (4)
125% (7)
-
如果在大纲中将 Profit% 标记为两遍,则 Essbase 使用
Profit % Sales公式重新计算 Profit% 值并生成正确的结果。表 34-7:双遍计算示例:更正结果
衡量标准/年度 Jan Feb 三月 Qtr1 Profit 75 50 120 245 (5) 销售 150 200 240 590 (6) 利润百分比
50% (1)
25% (2)
50% (3)
0% (4)
125% (7)
42% (8)
有关多个计算通过的信息,请参阅计算通过。
双通和智能计算的交互
如果要在块存储应用程序中使用智能计算和两遍计算,请使用与多维数据集配置匹配的方案,以确保 Essbase 准确计算双遍公式。
注意:
请勿对混合模式多维数据集使用两遍计算。仅使用解决顺序。
方案 A:两遍标记
在此方案中,将公式放置在大纲中,并根据需要将特定公式标记为双遍以获得最佳性能。
双遍公式没有额外计算通过
由于 Essbase 在计算数据块时会计算双遍公式,因此 Essbase 不需要执行额外的计算传递。
标记为“干净”的所有数据块
计算后,为了进行智能计算,所有数据块都标记为干净。
在大纲中将成员公式标记为双遍时, Essbase 将在计算每个数据块时执行双遍计算。但是,在计算脚本中重复公式时, Essbase 必须读取数据块并将其写入内存以重新计算公式。
方案 B:计算脚本
在此方案中,创建计算脚本以执行公式计算以获得最佳性能。
双遍公式的额外计算通过
Essbase 计算多维数据集,然后执行额外的计算传递来计算双遍公式。尽管在第一次计算后所有数据块都标记为干净,但 Essbase 会忽略与双遍公式相关的块的干净状态并重新计算这些块。
两遍公式的数据块未标记为“干净”
在第一次计算后, Essbase 已将所有数据块标记为干净。在第二次计算通过中, Essbase 会重新计算双遍公式所需的数据块。但是,由于第二个计算是部分计算,因此 Essbase 不会将重新计算的块标记为清除。在启用了智能计算的情况下重新计算时,可能会不必要地重新计算这些数据块。
如果多维数据集配置允许 Essbase 使用方案 B,请考虑使用计算脚本执行双遍公式计算。如果使用计算脚本,则 Essbase 仍会通过数据库进行额外的计算;但是,您可以确保 Essbase 在计算后将所有数据块标记为干净。请参见 Calculation Scripts for Two-Pass and Intelligent Calculation 。
选择双遍计算标记或计算脚本方法
虽然将帐户成员标记为两遍可能会带来性能优势,但一些应用程序无法使用此方法。检查这些资格,以查看是应用双遍标记还是创建计算脚本来执行两次计算以获得最佳性能和准确性:
-
如果成员位于标记为帐户的维中,则可以将该成员标记为双遍。对数据库执行默认计算时,如果 Essbase 在标记为帐户的维中,则自动重新计算标记为双遍的所有公式。
-
如果成员是任何维的动态计算成员,则可以将该成员标记为双遍。
-
您可能需要使用计算脚本来计算双遍公式以获得准确的结果,即使双遍标记可提供性能优势也是如此。请参见 Calculation Scripts for Two-Pass and Intelligent Calculation 。
-
如果数据库配置意味着 Essbase 使用方案 A,并且公式引用了其他数据块中的值,则必须使用计算脚本计算公式两次。
-
如果数据库配置意味着 Essbase 使用方案 B,您可能需要使用计算脚本来计算双遍公式。
默认计算的双遍
多维数据集设置可用于为默认计算启用双遍。在启用了双遍的立方上执行默认计算时, Essbase 会自动尝试计算标记为帐户的维中标记为双遍的公式。
注意:
请勿对混合模式多维数据集使用两遍计算。仅使用解决顺序。
请参阅以下主题:
要执行默认计算,可以使用执行计算 MaxL 语句。
要启用双遍计算,可以使用 alter database MaxL 语句。
双遍和智能计算的计算脚本
设计 Essbase 计算脚本以使用 Intelligent Calculation(智能计算)执行两遍计算时,将学习如何使用 SET UPDATECALC、SET CLEARUPDATESTATUS 和 CALC TWOPASS 优化计算。
注意:
请勿对混合模式多维数据集使用两遍计算。仅使用解决顺序。
如果您的大纲确实使用了双遍公式,请遵循以下准则,使计算尽可能准确和快速:
-
在重新计算双遍公式的命令之前,添加 SET UPDATECALC OFF 命令以禁用智能计算。如果启用了智能计算(默认值),则 Essbase 仅计算未标记为干净的数据块,但在启用了智能计算的情况下执行默认计算时,所有数据块都标记为干净,因此 Essbase 不会执行双遍公式重新计算。
-
Essbase 不会自动在计算脚本中重新计算双遍公式,因此必须使用 CALC TWOPASS 命令。
-
如果您更改了 CALC ALL 的默认计算,并且启用了智能计算,则在第一次计算后,数据块可能不会标记为干净。请参阅块存储多维数据集的智能计算。
要在执行数据库的首次完整计算时获得智能计算的性能优势,请使用以下系列示例中所示的方法之一。您的最佳方法取决于多维数据集的计算需求和大纲结构。
在后面的示例中,假定大纲具有标记为帐户的维,并且该维是密集维。您希望计算每个产品的销售额占所有产品的销售额的百分比。假设此公式应计算维:
Sales % Sales -> Product当 Essbase 计算每个产品的数据块时,它尚未计算值“销售”->“产品”,因此每个产品的销售结果占总销售额的百分比是不正确的。
具有大索引的智能计算
如果多维数据集索引很大,并且您希望使用智能计算,则可以使用以下任一选项以获得最佳性能。
计算脚本选项
使用此模型创建在启用了智能计算的情况下执行完整计算的计算脚本:
SET UPDATECALC ON;
CALC ALL;
SET UPDATECALC OFF;
SET CLEARUPDATESTATUS AFTER;
"Share of Sales" = Sales % Sales -> Product;计算脚本和双通过选项
要将成员标记为双遍,并使用计算脚本先计算完整的多维数据集,然后计算双遍成员:
-
在大纲中放置公式并将其标记为两遍。
-
将公式放置在标记为“Accounts(帐户)”的维中的相应成员(在我们的示例中为“Share of Sales(销售份额)”。
-
创建一个计算脚本,执行完整计算,然后执行双遍计算:
SET UPDATECALC ON; CALC ALL; SET UPDATECALC OFF; SET CLEARUPDATESTATUS AFTER; CALC TWOPASS;
客户端和计算脚本选项
要从客户机执行默认计算,然后使用计算脚本执行公式计算:
-
启用智能计算(如果此默认值已更改)。
-
执行完全计算。
-
使用与此示例类似的计算脚本可禁用智能计算并计算公式:
SET UPDATECALC OFF; SET CLEARUPDATESTATUS AFTER; "Share of Sales" = Sales % Sales -> Product;或者
SET UPDATECALC OFF; SET CLEARUPDATESTATUS AFTER; CALC TWOPASS;
上述所有示例选项均执行以下任务:
-
启用智能计算。
-
计算整个多维数据集并将数据块标记为干净。
-
禁用智能计算。
-
将重新计算的块标记为干净,即使此计算是多维数据集的部分计算也是如此。如果不使用命令 SET CLEARUPDATESTATUS AFTER,则 Essbase 仅在完全计算后才将数据块标记为清除。
-
Essbase 循环遍历多维数据集,仅计算相关成员的公式(在本例中为“销售份额”),或计算大纲中标记为双遍的所有公式。
示例:具有小索引的智能计算
要在多维数据集索引较小时使用智能计算:
-
创建计算脚本以计算多维数据集,但告诉 Essbase 不将计算的数据块标记为干净。
-
将所有数据块标记为干净,并且不重新计算数据块。
SET CLEARUPDATESTATUS OFF; CALC ALL; CALC TWOPASS; SET CLEARUPDATESTATUS ONLY; CALC ALL;-
SET CLEARUPDATESTATUS OFF 指示 Essbase 不将计算的数据块标记为干净。
-
第一个 CALC ALL 会使 Essbase 循环遍历多维数据集,从而计算所有脏数据块。Essbase 不会将计算的块标记为干净。
Essbase 不会自动重新计算标记为双遍的公式。
-
CALC TWOPASS 使 Essbase 循环遍历多维数据集,从而重新计算帐户维中的双遍公式。Essbase 会重新计算公式,因为之前 CALC ALL 未将所需的数据块标记为清除。Essbase 不会将重新计算的数据块标记为“干净”。
-
SET CLEARUPDATESTATUS ONLY 指示 Essbase 将数据块标记为干净,但不计算数据块(此命令禁用计算)。
-
最后一个 CALC ALL 会使 Essbase 循环遍历多维数据集,并将所有数据块标记为干净。Essbase 不会计算数据块。
-
示例:双传递公式的智能计算已关闭
要为双遍公式关闭智能计算,请创建执行下列任务的计算脚本:
-
禁用智能计算。
-
执行完全计算。
-
重复以下两遍公式:
SET UPDATECALC OFF; CALC ALL; "Share of Sales" = Sales % Sales -> Product;