如何在 DAX 计算列和 PowerQuery 自定义列之间选择
> 本文翻译自国际Power BI大师Marco Russo的文章——《Comparing DAX calculated columns with PowerQuery computed columns》。本文可帮助您了解在表需要添加计算列时在DAX和Power Query之间如何进行选择。
当您在Power BI、报表服务器或者PowerPivot中构建数据模型时,您可能需要使用附加的列扩展来自数据源的表,该列的内容来自现有数据。上述工具中有几种功能可用于创建此类附加列,但用户并不一定能够选择正确。
本文介绍了基于DAX表达式的计算列与Power Query生成的自定义列之间的主要区别。如您所见,通过访问同一表或者不同表的不同行的数据获得结果时,选择DAX计算列;但是,当要实现的业务逻辑依赖于同一表中其他列的值时,您应该选择PowerQuery自定义列。
重要说明:DirectQuery模型中的DAX计算列在查询时的计算方法与Power Query自定义列的计算方法类似。本文仅适用于在内存中导入数据的模型。
DAX计算列介绍
DAX计算列在将模型内容导入内存后计算DAX表达式的结果。DAX表达式对表的每一行执行,可以通过行上下文使用同一表的列,并且可以使用最初为空的筛选器上下文聚合数据。对每一行求值的DAX表达式的结果作为表的附加列存储在内存中;此结果可用于其他计算,以及筛选和分组数据。下面的屏幕截图显示了销售表中计算的价格范围列,它只取决于销售表[净价]列的值。
Power Query自定义列介绍
Power Query自定义列是一个M表达式,它定义了在将表导入数据模型之前应用于数据源的转换。根据表达式和数据源,Power Query自定义列的M表达式可以转换为对数据源的等效请求——就像SQL查询中的列表达式一样;Power Query引擎也可以计算它,修改来自数据源的行,这些行用于填充数据模型中的表。
下面的屏幕截图显示了销售表查询中计算的价格范围列,该列取决于净价格列的值。
DAX计算列和PowerQuery自定义列之间的区别
下方的列表列出了在考虑到特定方案时DAX计算列和Power Query自定义列之间的最重要的区别:
在模型中添加一列
- 一个新的DAX计算列不需要完全刷新该表
- 一个新的Power Query 自定义列需要完全刷新该表
完全刷新表格
- 在所有分区的数据加载并在内存中压缩后,引擎开始处理DAX计算列。
- 处理一个Power Query自定义列与处理来自数据源的任何其他列一样。
增量刷新和分区刷新
- 即使表中仅添加或刷新了几行,引擎也会处理表中所有行的DAX计算列。
- 引擎只计算在部分刷新中处理的行的PowerQuery自定义列的值。
压缩比较
- DAX计算列不参与对最佳压缩排序顺序的评估。因此,对列的压缩可能非常不理想,特别是对于具有少量唯一值的列。
- Power Query的自定义列与表中的任何其他列一样被压缩。
处理时间
- 处理单个DAX计算列的成本相当于对刷新操作中包含的每一行的DAX表达式进行连续计算。同一张表中的多个DAX计算列以一个与计算依赖项兼容的顺序依次处理。
- 当使用查询折叠优化表达式时,处理Power Query自定义列的成本主要取决于数据源。例如,如果将M表达式转换为等效的SQL表达式,那么性能和并行性完全依赖于SQL数据源。
- 改善一列的压缩可能会对数据模型中其他列的压缩产生负面影响。
查询性能
- 压缩效果更好的列的内存较小,通常可以提供更好的性能,这在涉及该列的筛选,分组和聚合操作中很重要。
- DAX计算列的压缩率可能低于Power Query自定义列的压缩率。
- 一列压缩的改进可能会对数据模型中其他列的压缩产生负面影响。
对不同压缩结果的解释
具有少量唯一值的计算列无法通过更改表的排序顺序进行优化。这实际上降低了压缩的效率。例如,我们使用上面描述的两种技术在包含超过1200万行的销售表中创建了价格范围列。VertiPaq 分析器显示,DAX中价格范围计算列的数据大小为1,993,968字节。
通过将价格范围创建为Power Query中的自定义列,数据大小仅为518,208字节。
尽管您消除了价格范围列大小的75%,但这并不一定意味着您从整个数据库大小中节省了相同的字节数(1,475,760)。其他列的压缩效果可能更差。例如,前面两个图中可见的数量和OrderDateKey列的大小都显著增加。在本例中,模型大小随着计算列的增加而增加,您可以从可下载的VertiPaq文件中看到这一点。然而,通过改变模型中单个列得到的结果几乎是不可预测的。如果您正在考虑添加多个计算列或自定义列,那么自定义列通常是更好的选择,尽管总体结果可能因情况而异。
何时使用Power Query自定义列
当表达式仅依赖于创建新列的表的同一行的其他列时,您应该使用Power Query 自定义列。本文示例中使用的价格范围列就是这种情况。
如果数据源是关系数据库,并且您能够合并可以有效地连接到数据源中的表,那么最好使用PowerQuery函数对表进行非规范化-而不是将多个表导入数据模型然后创建DAX 计算列使用RELATED函数从其他表中检索相应数据。
如果需要聚合来自其他表的行,那么在决定是否使用Power Query自定义列时需要注意。PowerQuery自定义列在数据源上执行聚合,这可能需要很长的执行时间。如果发生这种情况,应该考虑使用DAX计算列,以避免长时间的处理。
何时使用DAX计算列
每当无法在Power Query自定义列中实现相同计算时,都应使用DAX计算列。典型的情况是从模型中的其他表聚合数据。另一种情况是来自不同数据源的表的非规范化,因为无法使用Power Query中的查询折叠技术对其进行优化。
原文链接:
https://www.sqlbi.com/articles/comparing-dax-calculated-columns-with-power-query-computed-columns/
-
PowerPivot工坊原创文章,转载请注明出处!
如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“从Excel到Power BI数据分析可视化”系列课程。或者关注我们的公众号(PowerPivot工坊)后猛戳”在线学习”。
长按下方二维码关注“Power Pivot工坊”获取更多微软Power BI、PowerPivot相关文章、资讯,欢迎小伙伴儿们转发分享~
Power Pivot工坊
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)