使用变量改进性能和故障排除

已完成

可以在 DAX 公式中使用变量来帮助您编写更简单且更高效的计算。 刚开始使用 Power BI Desktop 的开发人员未充分利用变量,但变量非常有效,您应充分利用这些变量。

某些表达式涉及使用许多嵌套函数以及重复使用表达式逻辑。 这些表达式需要较长时间进行处理,难以读取,因而难以进行故障排除。 如果您使用变量,则可以节省查询处理时间。 执行此更改步骤是为了优化语义模型的性能。

在语义模型中使用变量具有以下优势:

  • 改进了性能 - 变量可以使度量值更有效,因为它们消除了 Power BI 多次计算同一表达式的需要。 只需花费大约原来一半的处理时间即可在查询中实现相同结果。
  • 改进了可读性 - 变量具有简短的自描述名称,用于代替不明确的多字表达式。 您可能会发现,使用变量时更易于阅读和理解公式。
  • 简化了调试 - 可以使用变量调试公式和测试表达式,这在进行故障排除时可能很有用。
  • 降低了复杂性 - 变量不需要使用 EARLIEREARLIEST 函数,这些函数难以理解。 在引入变量之前需要使用这些函数,并且用引入了新筛选上下文的复杂表达式编写函数。 现在,您可以使用变量而不是这些函数,接下来可以编写更简单的公式。

使用变量提高性能

为了说明如何使用变量来使度量值更高效,下表以两种不同的方式显示度量值定义。 请注意,公式会重复用于计算“去年同期”的表达式,但采用两种不同的方式:第一个实例使用普通 DAX 计算方法,而第二个实例在计算中使用变量。

该表的第二行显示改进的度量值定义。 此定义使用 VAR 关键字引入名为 SalesPriorYear 的变量,并使用表达式将“去年同期”结果分配到该新变量。 然后,它在 DIVIDE 函数中使用该变量两次。

不使用变量

Sales YoY Growth =
DIVIDE(
    ([Sales] - CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))),
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
)

使用变量

Sales YoY Growth =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
VAR SalesVariance =
    DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)
RETURN
    SalesVariance

在第一个度量值定义中,公式效率低下,因为它需要使用 Power BI 对同一表达式进行两次求值。 第二个定义更有效,因为由于变量,Power BI 只需要对 PARALLELPERIOD 函数进行一次求值。

如果语义模型具有包含多个度量值的多个查询,则使用变量可将总体查询处理时间减少一半,并提高语义模型的总体性能。 此外,此解决方案十分简单;想象一下在公式变得更加复杂时(例如,在处理百分比和运行总计时)所实现的节省。

使用变量或提高可读性

除了性能改进之外,您可能会注意到变量的使用如何使代码更易于读取。

使用变量时,最佳做法是对变量使用描述性名称。 在上一个示例中,将变量命名为 SalesPriorYear,这清楚地说明了变量正在计算的内容。 考虑使用名为 Xtempvariable1 的变量的结果;该变量的用途根本就不清楚。

使用清晰、简洁、有意义的名称将有助于您更轻松地理解和记录正在计算的内容,并且其他开发人员将来维护起来也会简单得多。

使用变量对多个步骤进行故障排除

可以使用变量帮助调试公式并确定问题所在。 通过对每个变量进行单独求值并在 RETURN 子句中撤回它们,变量有助于简化对 DAX 计算进行故障排除的任务。

在下面的示例中,您将测试分配到变量的表达式。 为了进行调试,您暂时重写 RETURN 子句以返回变量。 因为变量位于 RETURN 表达式之后,因此度量值定义仅返回 SalesPriorYear 变量。

Sales YoY Growth % =
VAR SalesPriorYear =  CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
VAR SalesPriorYear% = DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)  
RETURN SalesPriorYear%

RETURN 子句仅返回 SalesPriorYear% 变量。 此方法使您可以在完成调试之后还原表达式。 它还使计算更易于理解,因为这降低了 DAX 代码的复杂性。