通过自动日期/时间和DAX变量提高Power BI性能
为此演示,我已经从AdventureWorks2014数据库中导入了“ SalesOrderHeader ”表 。请注意,该表具有四个datetime列,如下图所示。
![快照以显示表上的日期列](https://www.mssqltips.com/tipimages2/6517_power-bi-report-performance-optimization.001.png)
因此,当将此模型保存到文件位置时,我可以查看模型的大小,如下所示,当前大小为1,721KB。
![显示初始模型大小的快照](https://www.mssqltips.com/tipimages2/6517_power-bi-report-performance-optimization.002.png)
通常,大多数模型尺寸通常都大于此尺寸,因此出于优化目的,有必要通过在数据加载选项设置中禁用“自动日期/时间”来减小模型尺寸。我们可以通过两种方式(全局或当前文件)进行配置。如果在全局范围内执行,则只会影响导入到模型中的新文件,在另一方面,如果在当前文件上执行,则会影响模型中的当前文件。
对于本演示,我已使用“当前文件”选项应用了配置,如下图所示。点击“ 文件 ”。
![显示Power BI Desktop中“文件”选项卡的位置的快照](https://www.mssqltips.com/tipimages2/6517_power-bi-report-performance-optimization.003.png)
然后选择“ 选项和设置 ”,然后选择 “ 选项 ”。
![快照显示导航到Power BI桌面中的选项设置](https://www.mssqltips.com/tipimages2/6517_power-bi-report-performance-optimization.004.png)
接下来的两个图显示了用于配置“自动日期/时间”选项的“全局”选项和“当前文件”选项。
![快照以显示时间智能的全局数据加载选项](https://www.mssqltips.com/tipimages2/6517_power-bi-report-performance-optimization.005.png)
![快照以显示“时间智能”的“当前文件数据加载”选项](https://www.mssqltips.com/tipimages2/6517_power-bi-report-performance-optimization.006.png)
在“当前文件数据加载”部分中取消选中“自动日期/时间”选项后,单击“ 确定 ”。然后,如果您进行检查,现在可以看到SalesOrderHeader表中DateTime列后面的日历符号都消失了,如下图所示。
![在“当前文件管理器”选项设置中停用日期时间列后的快照](https://www.mssqltips.com/tipimages2/6517_power-bi-report-performance-optimization.007.png)
然后像往常一样保存您的报告,并返回到先前保存PBIX的位置,现在可以看到模型大小已从1,721KB减少到约1,697KB,相差约24KB。请注意,根据您的模型,此值可能会更高,在更大的模型中,此效果甚至更高。参见下图。
![快照显示最终模型大小](https://www.mssqltips.com/tipimages2/6517_power-bi-report-performance-optimization.008.png)
在DAX度量计算中使用更多变量
在Power BI数据模型中,变量的重要性包括提高性能,降低复杂度,提高可读性 和简化调试。但是,本文仅着眼于使用变量来提高性能。
为了演示变量的使用如何帮助优化Power BI模型(尤其是视觉效果的刷新时间),我再次使用了 AdventureWork2014中导入的SalesOrderHeader表。我以两种不同的方式创建了相同的DAX计算度量,一种带有变量,另一种没有变量。两种度量均用于计算已完成的总订单量的同比增长。计算的度量如下。
![快照显示DAX计算的不带变量的度量。](https://www.mssqltips.com/tipimages2/6517_power-bi-report-performance-optimization.009.png)
Orders YoY Growth (Without Variables) = DIVIDE ( ( [Total Orders] - CALCULATE ( [Total Orders], PARALLELPERIOD ( DateTable[Date], -12, MONTH ) ) ), CALCULATE ( [Total Orders], PARALLELPERIOD ( DateTable[Date], -12, MONTH ) ) )
Orders YoY Growth (With Variables) = VAR _OrdersPriorYear = CALCULATE ( [Total Orders], PARALLELPERIOD ( DateTable[Date], -12, MONTH ) ) VAR _OrdersVariance = DIVIDE (([Total Orders] - _OrdersPriorYear), _OrdersPriorYear) RETURN _OrdersVariance
除了没有变量的度量效率低下这一事实之外,因为它要求Power BI两次评估相同的表达式,而且还需要花费更多的时间来刷新,因此还需要花费更多的时间在视觉上进行渲染。
第二个度量表达式更有效,因为由于其中的变量,它只对表达式求值一次。同样,在视觉上进行渲染所需的时间较短,因为通常需要较短的时间进行刷新。
为了演示变量对刷新时间的影响,我使用了Power BI Desktop中的性能分析器来对此进行如下显示。
![快照显示性能分析器上的查询刷新,以实现无变量的卡可视化](https://www.mssqltips.com/tipimages2/6517_power-bi-report-performance-optimization.011.png)
上图显示了不带变量的测量大约需要170毫秒来刷新卡片外观。大部分时间都由切片器可视化程序所需的“其他”时间用于准备查询,等待其他可视化程序完成或执行其他后台处理。
![快照显示了性能分析器上的查询刷新,以便对带有变量的卡进行可视化显示](https://www.mssqltips.com/tipimages2/6517_power-bi-report-performance-optimization.012.png)
上图显示,带有变量的测量花费了127毫秒的较短时间来刷新相同的卡片视觉效果。呈现视觉效果所需的时间以及切片器视觉效果用于准备查询,等待其他视觉效果完成或执行其他背景处理所需的时间也小于不带变量的度量表达式的时间。
在对性能问题进行故障排除时,进一步调查诸如DAX Studio之类的外部工具上的问题可能会有所帮助,它可以真正提供有关将精力集中在解决性能问题上的更多信息。我将创建另一个技巧,介绍如何使用DAX Studio调查性能问题。