魔鬼就在细节中:通过独特思维成为Power BI冠军
魔鬼就在细节中:成为Power BI冠军的独特思维
Power Bi充满了“默默无闻的英雄”!其中之一,分析面板与更改可视类型的结合,帮助我显著提高了Power BI报告的性能

几周前,我为我的一个客户进行了Power BI报告的性能调优工作。报告页面的渲染速度非常慢(超过15秒)。为了给你一些背景:该报告使用了与SSAS Tabular 2016中托管的表格模型的实时连接。
如果我告诉你,我成功地将报告页面的性能提高了两倍以上,而且没有改变后面计算的任何一行DAX代码,你会怎么想?!
继续阅读,你将看到为什么很多时候细节决定成败,以及如何开拓思维,帮助你成为真正的Power BI高手:)

让我快速解释一下上面的插图。有一个线性和分组柱状图可视化,四条线代表左侧切片器(报告阈值和三个层次)的用户选择,而柱状图则是总销售额。数据按年份和产品进行细分。每条线都是使用DAX计算的(顺便说一下,SSAS 2016中没有AVAILABLE函数)。
我打开了Performance Analyzer,获取了DAX查询,并在DAX Studio中执行了它:

正如你所看到的,查询执行需要13.5秒(在运行之前清除缓存),而大部分时间都花在了公式引擎上(76%)。这一点很重要,因为我们将把这个结果与改进后的报告页面进行比较。
那么,有经验的Power BI开发人员会如何优化这种情况?重新编写DAX代码?错误!
让我们看看在不改变DAX逻辑的情况下可以做些什么!
如果你不知道,Power BI提供了一个被低估的功能,或者我们可以将其视为“默默无闻的英雄”,那就是分析面板。

我们中的大多数人显然在其他两个面板(数据和格式)中花费了大部分Power BI开发时间。因此,你会惊讶于有多少Power BI开发人员甚至不知道这第三个面板的存在,即使知道,也很少使用。
不深入细节,该面板可让你向可视化图表添加其他分析元素,如最小值、最大值、平均值、中位数线、误差线等。根据可视类型,不是所有选项都可用!而这在我的用例中非常重要。
一旦我打开了分析面板,只有误差线可用:

基本上,这里的想法是,由于这四行不会根据可视化本身的数字而变化(它们具有基于切片选择的常量值),我们可以利用分析面板中的常数线功能。由于线性和聚类柱形图可视化中没有可用的常数线,让我们复制我们的可视化并将其类型更改为常规聚类柱形图。

如您所见,“数字”在这里,但我们丢失了我们的线条。让我们切换到分析面板并创建4条常数线,每条线都基于切片选择生成的DAX度量:

第一步是添加一条常数线。接下来,展开线性属性,并选择“fX”按钮作为值,该按钮使您能够根据表达式设置常数线的值(在我们的情况下,这是由DAX度量生成的表达式)。为所有四条线重复此过程。
我再次提醒您,请注意我根本没有修改DAX代码!
一旦关闭Y轴,这就是我的“孪生”可视化效果:

几乎一样,对吧?
好的,现在让我们来检查一下这个可视化的性能:

它比原始可视化快了5秒以上!如果您仔细比较之前的DAX Studio截图,您会注意到存储引擎查询的数量与之前的情况完全相同(SE时间几乎相同),这意味着存储引擎需要完成完全相同的工作以检索数据。
关键的区别在于公式引擎时间——与原始可视化不同,原始可视化中总查询时间的75%花在了FE上,而这一次它减少到了60%以下!
我很好奇为什么会发生这种情况,以及公式引擎生成的两个查询计划之间的主要区别。


两个查询计划之间的“唯一”区别在于较慢版本创建了两个虚拟表:一个用于计算可视化中“列”的值(_ScopedCoreI0),另一个用于计算相同可视化中线条的值(_ScopedCoreDM0)。最后,使用NATURALLEFTOUTERJOIN函数将这两个表连接起来。
在较快的版本中,没有计算线条值的第二个表。此外,计算线条值的度量被包装在IGNORE函数中,该函数将SUMMARIZECOLUMNS表达式中的度量标记为在非空行的评估中被省略。
结论
正如您所见,改变可视化类型,结合使用“不为人知的英雄”分析面板,在这种情况下确保了显著的性能提升。正如人们常说的:“魔鬼就在细节中” — 因此,思考超越常规会导致一些创造性的解决方案。
谢谢阅读!