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

已完成

可以在 DAX 公式中使用变量来帮助编写更简单且更高效的计算。 在 Power BI Desktop 中开始进行处理的开发人员未充分使用变量,但它们十分有效,在创建度量值时应默认使用它们。

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

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

  • 提高了性能 - 变量可以使度量值更高效,因为它们无需 Power BI 多次计算同一表达式。 只需花费大约一半的原始处理时间便可在查询中实现相同结果。

  • 改进了可读性 - 变量具有简短的自描述名称,用于代替不明确的多字表达式。 使用变量时,可能会发现更易于阅读和理解公式。

  • 简化了调试 - 可以使用变量调试公式和测试表达式,这在故障排除过程中可能非常有用。

  • 降低了复杂性 - 变量不需要使用较早或最早的 DAX 函数,这些函数难以理解。 在引入变量之前需要使用这些函数,它们采用引入新筛选上下文的复杂表达式进行编写。 现在可以使用变量而不是这些函数,便可以编写更少的复杂公式。

使用变量提高性能

为了说明如何使用变量来使度量值更高效,下表以两种不同的方式显示度量值定义。 请注意,公式会重复用于计算“上一年同一时间段”的表达式,但采用两种不同的方式:第一个实例使用普通 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,这清楚地声明了变量所计算的内容。 请考虑使用名为 X、temp 或 variable1 的变量的结果;变量的用途完全不明确。

使用清晰、简洁、有意义的名称将有助于使你更轻松地理解尝试计算的内容,而其他开发人员在将来可以更简单地维护报表。

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

可以使用变量帮助调试公式并确定问题所在。 变量通过单独计算每个变量并在 RETURN 表达式之后重新调用它们,来帮助简化对 DAX 计算进行故障排除的任务。

在下面的示例中,你会测试分配给变量的表达式。 为了调试,要暂时重写 RETURN 表达式以写入变量。 度量值定义只返回 SalesPriorYear 变量,因为它在 RETURN 表达式之后。

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

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