通过建模决策的结果进行思考是确保良好模型性能的关键部分。换句话说,确保计算引擎不会超过。本文重点介绍了如何减少计算引擎负载的一些想法。

公式应该很简单;嵌套或使用多种组合的公式使用有价值的处理时间。编写长长的,涉及的公式会使引擎努力工作。当用户盯着屏幕时,秒数。简单更好。分解公式并使用其他选项有助于快速保持处理速度。

在模型中使用这些技术时,您必须保持平衡,因此指导如下:

  • 分解最常见的公式
  • 分解最复杂的公式
  • 分解您无法解释一句目的的任何公式

具有许多计算成分的公式

公式的结构可以与模型中的输入更改时发生的计算量有显着影响。考虑以下计算应用程序中总利润的示例。有五个要素构成了计算:产品销售,服务销售,销售成本(COG),运营支出(OP EX)以及租金和公用事业。每个不同的元素都在单独的模块中计算。报告模块将结果汇总到总利润订单项中,该项​​目使用下面显示的公式计算出来。公式1.png当COGS的一个组件发生变化时会发生什么?由于所有源组件都包含在公式中,当任何组件中的任何内容都会更改时,该公式就会重新计算。如果有大量的组件表达式,则可以在计算引擎上占用比必要的更大的开销。

有一种简单的方法来构建模块来减少对计算引擎的需求。您可以通过为每个组件创建一个订单项,并将总利润公式作为单独的行项目添加总利润公式来分开报告模块中的输入行。这样,更改对源数据仅导致相关行项目重新计算。公式构造2.png

例如,产品销售计算的更改仅影响产品销售和报告模块中的总利润界限项目;服务销售,OP EX,COGS和租金和公用事业没有变化。同样,齿轮的变化仅影响报告模块中的齿轮和总利润。

牢记一般指南。将每个下游公式分解为单个订单项是不切实际的。

计划提供公式的早期出口

条件公式(如果/时)就模型构建器的最佳结构是对公式的最佳结构而构成的挑战,而没有使其过于复杂且难以阅读或理解。基本原则是避免使计算引擎的工作量超过必要的工作。尝试设置公式以尽快完成计算。

始终首先放置最有可能发生的状况。这样,计算引擎可以尽早退出表达式处理。

这是评估季节性营销促销的示例:公式构造3.png

夏季促销活动持续了三个月,冬季晋升了两个月。

公式构造4.png

在没有促销的几个月里,这种公式不是最佳的,并且需要更长的时间才能计算。

公式构造5.png

这是更好的,因为公式将在第一个条件后更频繁地退出。

有一个更好的方法可以做到这一点。遵循上面的原则,添加另一个订单项以无晋升。公式构造6.png

然后公式可以变成:

公式构造7.png

这甚至更好,因为已经计算了没有促销的计算,并且夏季促销比冬季促销更频繁。

并不总是清楚哪种情况会比其他情况更频繁地发生,但是以下是如何优化公式的一些示例:

  • Finditem公式
    公式的FindItem元素将在整个列表中工作,以寻找文本项目,如果找不到引用的文本,它将返回空白。如果引用文本为空白,则它也将返回空白。在公式的开头插入条件表达式可以防止计算引擎被超额释放。
    1. 如果是iSnotblank(文本),则FindItem(列表,文本)else blank
    2. 或者
    3. 如果空白(文本),则为空白finditem(列表,文本)
    如果大多数参考文本包含数据和第二个表达式,则使用第一个表达式,如果比数据多空白。
  • 滞后,偏移,邮寄等。
    例如,在某些情况下不需要滞后或偏移数据,例如,如果滞后或偏移参数为0。计算值与所讨论的期限相同。在公式开始时添加条件将有助于消除不必要的计算:
    1. 如果lag_parameter = 0,则0 else lag(lineItem,lag_parameter,0)
    2. 或者
    3. 如果lag_parameter <> 0,则lag(lineItem,lag_parameter,0)else 0
    公式A或B的使用将取决于滞后参数中最有可能出现的0。
  • 布尔人
    避免为格式为布尔值的订单项添加不必要的混乱。无需包含真实或错误的表达,因为条件将评估为True或false。
    1. 销售> 0
    2. 代替
    3. 如果销售> 0,那么否则false
本文中的内容尚未针对所有ANAPLAN实施进行评估,也可能不建议您针对您的具体情况进行评估。
在应用本文中的任何想法或步骤之前,请咨询您的内部管理员。
注释

很棒的建议!

嗨,大卫,

感谢您的帖子。

我有一个有关FindItem提示的问题。例如,我们知道我们将拥有最大5%的文本字段作为空白。通过您的建议,我们仅节省了这些案例(即5%)的FindItem查找时间,并且我们使发动机可以计算95%其他单元的语句。在这种情况下,计算不是使计算速度较慢吗?

谢谢,

海克

嗨,海克

感谢您的问题和对文章的兴趣。

空白的检查非常快,但是这超过了遍历列表的时间更难证明。如果清单非常大(例如超过100万个项目),我认为值得检查。对于一小部分空白的较小列表,可能不需要。

与许多建模决策一样,答案通常是“取决于”,我们试图提出一种最佳实践,该实践将涵盖大多数情况,并提供解决方案或思维方式,如果您注意到某些绩效降低。我们已经看到了进行检查的巨大表现。

我要说的是,总是最好检查。如果您删除公式,请点击Enter,然后再次粘贴并击中Enter,这将迫使该订单项的完整重新计算。因此,将其与检查时间,然后无需时间。

让我知道您发现了什么,但是我们将进行一些内部测试,以查看是否有一个阈值,这有很大的不同。

这是一个有趣的问题,有些功能对空白进行了内置检查,但是FindItem并不是其中之一。我们已经问我们是否可以包括内置的检查,这将否定该检查的需求。

再次感谢您,因为这种对话会提示讨论并使产品更好。

嗨,大卫,

感谢您的解释,很高兴知道一些背景。

我已经测试了您在带有14K单元的平面模块上提出的内容(其中1400个是空白)。还基于该平面列表创建了一个具有200MLN单元的模块。并且在两种情况下都看不到差异。猜猜应该用一些工具来测量它。

谢谢,
海克

这些建议很棒,但是公式经常不太易于分解或重新以这种干净的方式进行优化。当公式变得非常漫长而复杂时,很难知道在哪里以及如何将其分解成可管理的零件。是否有可能获得比上面的示例更复杂的示例,并就如何处理的最佳实践提供一些指导?我在我的客户中看到了一个在Word文档中长达三页的时间,并试图弄清楚它使我的头部旋转。

@mjpearlman

我同意我们经常看到更复杂的公式。我花了很多一天的时间试图理解和优化可怕的公式。3页很短!我看过一个50页公式。

没有简单的方法来分解它,但是我的建议如下:

1。复制公式向单词或Excel进行分析。我讨厌自己这么说,但通常会更容易分解公式的元素。y

2。看重复的表情。从上面,使用查找来突出显示重复的单词/表达式效果很好。这些是将候选人分成单独的订单项。我们经常看到公式的相同部分重复。

例如。如果x,则a / b * c else如果y,则a / d * c else 1

这里A * c在两种情况下都是常见的,因此可以分开并引用。因此,创建一个新的行项目= a * c,公式变为:

“新行项目” /如果x,则b else如果y,则d else 1

甚至更好地将其分成两个

创建另一个行项目=如果x然后b否则如果y,则d其他1

然后,原始公式是:

“新订单项目” /“另一个行项目”

3。有多个IFS时突破条件。在许多情况下,通常可以用查找来代替这些(尤其是当涉及(涉及项目...)时,但是分类各种条件使得更容易脱毛和测试以及改善性能

4。寻找“模式,变量和参数”。我们经常看到一个遵循类似构曲的公式的部分,并具有数字值作为参数的形式,例如 *3, *4, *5。这些通常可以分开并重新配置以提高效率

还请记住,如果您确实将订单项拆分,则不太可能需要打开摘要选项,因此可以最大程度地减少其他订单项的单元格数

我希望有帮助

大卫

@davidsmith

与FindItem一起有区别

如果是iSnotblank(文本),则FindItem(列表,文本)else blank

vs

如果是iSnotblank(finditem(list,text)),则finditem(列表,文本)否则空白

性能中?

@Karank

划分组件的性能总是更好的,因此第一个将更有效。

另外,您可以看到重复了finditem(列表,文本)

“一次计算,参考多次参考”

另外,如果您知道数据中没有空白,您甚至可以摆脱ISNOTBLANK

在这种情况下,Finditem(项目,文本)很好

希望有帮助

大卫

版本历史记录
最后更新:
06-03-2022下午02:39
更新者:
关于作者
贡献者
标签(2)