数据块的智能计算
了解 Essbase 智能计算如何处理密集计算和稀疏计算、并发计算以及多遍计算。
Essbase 为稀疏维成员的每个唯一组合创建一个数据块,前提是该组合至少存在一个数据值。每个数据块表示稀疏维成员的唯一组合的所有密集维成员值。
例如,在示例基本数据库中,“市场”和“产品”维度稀疏。因此,数据块 "New York" -> "Colas" 表示稀疏组合 "New York" -> "Colas" 的 "Year"、"Measures" 和 "Scenario" 维中的所有成员值。
以下各节假定您熟悉上层、层 0 和输入数据块的概念,如 Data Storage in Data Blocks 中所述。
密集维的智能计算
计算密集维但不使用 FIX 命令时, Essbase 会计算数据库中每个数据块中的至少一些数据值。就智能计算状态而言,块会从密集计算中标记为“干净”。
例如,以下计算脚本将计算密集的“年”维。
SET CLEARUPDATESTATUS AFTER;
CALC DIM(Year);由于 Year 是密集的,因此多维数据集中的每个块都包含 Year 的成员。因此, Essbase 会计算每个块。
然后,由于脚本使用 SET CLEARUPDATESTATUS AFTER 命令,因此 Essbase 会将多维数据集中的所有数据块标记为清除。
稀疏维的智能计算
计算稀疏维时, Essbase 可能不需要计算数据库中的每个数据块。了解智能计算的干净/脏更新状态如何影响级别 0 和上层块的状态,以及如何避免不必要的计算。
例如,以下计算脚本基于 Sample Basic 数据库:
SET CLEARUPDATESTATUS AFTER;
CALC DIM(Product);此脚本计算产品维,这是一个稀疏维。由于 Product 是稀疏的,因此 Product 维上的每个成员都存在一个数据块。例如,纽约 -> Colas 存在一个数据块,纽约 -> 100-10 存在另一个数据块。
0 级效果
如果在级别 0 将数据加载到多维数据集,则受影响的块将被标记为脏块。如果随后仅计算稀疏维,则不会计算 0 级块,并保持脏状态。仅重新计算稀疏维或维时, Essbase 会重新计算较高级别的数据块。
注意:
如果相应的稀疏 0 级成员应用了公式,则 Essbase 会计算 0 级数据块。
数据块 New York -> 100-10 是一个级别 0 块;它不代表稀疏维(市场或产品)上的父代成员。New York -> 100-10 的数据值是输入值,它们被加载到数据库中。因此, Essbase 不需要计算此数据块。Essbase 也不会将纽约 -> 100-10 的数据块标记为干净,即使脚本使用 SET CLEARUPDATESTATUS AFTER 命令也是如此。
上层效果
当 Essbase 计算稀疏维时,如果块依赖于一个或多个脏子块,则会重新计算上层数据块。
Colas 是 Product 维上的父级成员。Essbase 必须计算 Colas 的值,因此 Essbase 会计算此数据块。由于该脚本使用 SET CLEARUPDATESTATUS AFTER 命令,因此 Essbase 会将该数据块标记为干净。
不必要的计算
您可以通过至少计算一个密集维来避免不必要的计算。在不使用 FIX 命令计算密集维时,将在每个块(包括 0 级块)中计算数据值。因此 0 级块标记为干净。
智能计算和并发计算
启用智能计算时,请采取并发计算的预防措施。如果多个计算尝试计算相同的块,则 Essbase 可能不会重新计算数据块,因为它们已标记为清除。
在以下示例中,基于示例基本数据库,"Actual"(实际)和 "Budget"(预算)是密集方案维的成员。由于方案是密集的,因此数据库中的每个块都包含“实际”和“预算”值。如果用户 1 运行以下计算脚本,则 Essbase 将计算代表纽约的所有数据块的实际值。
SET CLEARUPDATESTATUS AFTER;
FIX("New York", Actual)
CALC DIM(Product, Year);
ENDFIXEssbase 将计算的数据块标记为“干净”,但不是每个计算的块中的所有值都已计算。例如,尚未计算“预算”值。
如果用户 2 运行以下计算脚本来计算纽约的预算值,则 Essbase 不会重新计算指定的块,因为它们已标记为“干净”。“预算”的计算结果不正确。
SET CLEARUPDATESTATUS AFTER;
FIX("New York", Budget)
CALC DIM(Product, Year);
ENDFIX解决此问题的一种方法是使方案维稀疏。然后,“Actual(实际)”和“Budget(预算)”值位于不同的块中;例如,“New York(纽约)”>“Colas(大厅)”>“Actual(实际)”和“New York(纽约)”>“Colas(大厅)”>“Budget(预算)”。在这种情况下,第二个计算脚本会正确计算“预算”块。
运行并发计算可能需要增加数据高速缓存。
智能计算和多遍计算
在某些情况下,需要多次传递的 Essbase 计算脚本可能与使用智能计算不兼容。
当 Essbase 在第一次计算通过数据库时计算数据块时,会将数据块标记为“干净”。如果您尝试在启用了智能计算的后续传递中计算相同的数据块,则 Essbase 不会重新计算数据块,因为它们已标记为“干净”。
如果可能, Essbase 将在一次计算传递中计算数据库。
使用计算脚本计算数据库时, Essbase 执行的计算传递次数取决于计算脚本。
例如,假设 Essbase 在第一次计算通过时计算块,并将其标记为“干净”。如果在启用智能计算时尝试在后续传递中计算相同的块,则 Essbase 不会重新计算数据块,因为它们已标记为“干净”。
多遍计算的示例和解决方案
这些示例描述了产生不正确的 Essbase 计算结果的情况,并提供了用于获取正确结果的解决方案。它们基于示例基本数据库,并假定已启用智能计算。
示例 1:智能计算和双遍
以下计算脚本将执行默认计算,然后执行双遍计算:
CALC ALL;
CALC TWOPASS;错误
Essbase 计算数据库中的脏数据块,并将所有数据块标记为“干净”。然后, Essbase 需要重新计算标记为帐户的维中标记为双遍的成员。但是, Essbase 不会重新计算指定的数据块,因为它们已标记为“干净”。计算结果不正确。
解决方案
您可以通过禁用双遍计算的智能计算来计算正确的结果。
示例 2:SET CLEARUPDATESTATUS 和 FIX
此计算脚本计算纽约的数据值。计算基于“产品”维度:
SET CLEARUPDATESTATUS AFTER;
FIX("New York")
CALC DIM(Product);
ENDFIX
CALC TWOPASS;错误
Essbase 执行以下流程:
-
Essbase 会循环使用数据库来计算表示纽约的脏数据块。计算基于“产品”维度。因此, Essbase 仅计算表示 Product 维上的父代成员的块(例如,New York -> Colas、New York -> Root Beer 和 New York -> Fruit Soda),然后仅计算 Product 维的聚合和公式。
-
由于使用了 SET CLEARUPDATESTATUS AFTER 命令,因此 Essbase 会将计算的数据块标记为清除,尽管尚未计算每个计算块中的所有数据值。
-
Essbase 应重新计算标记为帐户的维中标记为双遍的成员;但是,在上一步的计算中,其中一些数据块已标记为清除。Essbase 不会重新计算标记为干净的数据块。计算结果不正确。
解决方案
您可以通过禁用双遍计算的智能计算来计算正确的结果。
示例 3:SET CLEARUPDATESTATUS 和两个 CALC DIM 命令
此计算脚本根据“产品”和“年份”维度来计算数据库。由于使用了两个 CALC DIM 命令,因此 Essbase 会通过数据库进行两次计算:
SET CLEARUPDATESTATUS AFTER;
CALC DIM(Product);
CALC DIM(Year);错误
Essbase 执行以下流程:
-
Essbase 会循环使用数据库来计算脏数据块。计算基于产品维,如示例 2 中所示。
-
由于使用了 SET CLEARUPDATESTATUS AFTER 命令,因此 Essbase 会将计算的数据块标记为清除,尽管尚未计算每个计算块中的所有数据值。
-
Essbase 应重新计算数据块。重新计算基于“年”维度。但是,由于上一步中的计算,某些数据块已标记为干净, Essbase 不会重新计算它们。计算结果不正确。
解决方案
可以使用一个 CALC DIM 命令计算“Product(产品)”和“Year(年份)”维度,从而计算正确的结果。Essbase 在一次计算传递中计算两个维。
以下计算脚本将计算正确的结果:
SET CLEARUPDATESTATUS AFTER;
CALC DIM(Product, Year);注意:
在一个 CALC DIM 命令中计算多个维时, Essbase 将按默认计算顺序而不是在命令中列出这些维的顺序计算这些维。请参阅成员计算顺序。
示例 4:两个计算脚本
此示例计算纽约的数据值,但使用两个计算脚本基于两个维度进行计算。第一个计算脚本计算产品维:
SET CLEARUPDATESTATUS AFTER;
FIX("New York")
CALC DIM(Product);
ENDFIXEssbase 计算包括纽约的数据块。由于计算基于“产品”维,因此 Essbase 仅计算包含“产品”维上的父代成员的脏块(例如“纽约”->“Colas”->“纽约”->“根啤酒”和“纽约”->“水果汽水”),并且仅计算“产品”维的聚合和公式。
由于使用 CLEARUPDATESTATUS AFTER 命令, Essbase 会将计算的数据块标记为清除,尽管尚未计算每个计算块中的所有数据值。
第二个计算脚本计算年份维:
SET CLEARUPDATESTATUS AFTER;
FIX("New York")
CALC DIM(Year);
ENDFIXEssbase 计算表示纽约的数据块。由于计算基于 Year 维(即密集维),因此 Essbase 应计算包括 New York 的所有数据块,尽管在每个块中, Essbase 仅计算 Year 维的聚合和公式。
错误
作为第一次计算的结果,纽约的某些数据块已标记为干净。Essbase 不会使用第二个计算脚本重新计算这些数据块,因为这些数据块被标记为“干净”。计算结果不正确。
解决方案
您可以通过告知 Essbase 不将计算的数据块标记为清除来计算正确的结果。以下计算脚本将计算正确的结果:
SET CLEARUPDATESTATUS OFF;
FIX("New York")
CALC DIM(Product);
ENDFIX
SET CLEARUPDATESTATUS AFTER;
FIX("New York")
CALC DIM(Year);
ENDFIX使用 SET CLEARUPDATESTATUS OFF 命令, Essbase 会计算脏数据块,但不会将其标记为干净,这与 SET CLEARUPDATESTATUS AFTER 命令不同。
此解决方案假定数据块在以前的数据库部分计算中未标记为干净。
您可以通过禁用“智能计算”来确保计算所有数据块,而不考虑其状态。以下计算脚本计算所有指定的数据块,而不考虑其清除或脏状态:
SET UPDATECALC OFF;
FIX("New York")
CALC DIM(Year, Product);
ENDFIX由于您未使用 SET CLEARUPDATESTATUS AFTER 命令,因此 Essbase 不会将计算的数据块标记为清除。