Power BI性能提升的10大秘密武器(续)
在这个由四个部分组成的十大Power BI性能技巧第1部分中,小悦与大家分享并解释了在Power BI开发过程中应结合的前5个性能提升的技巧。如果大家还没有阅读过它——Power BI性能提升的5大秘密武器,一定要去看看,特别是因为它突出了最重要的性能提示。现在,让我们继续分享接下来的5条性能秘诀,这些秘诀应用应该被合并到一起,以进一步提高我们的Power BI解决方案的性能。本文将和大家继续重点分享Power BI性能介绍和最佳实践的十大秘诀。
秘诀五 问题计算列
当我们需要在模型中已有的数据之外创建某种形式的计算时,我们可以选择使用“计算列”或“度量值”。在Power BI解决方案中,大家是否有发现计算列与度量比较中被高度使用,因为它们似乎是通过DAX公式构造计算时的首选选项。从所有的讨论中,很多时候这只是归结为计算列在模型中的物理存在,并且由于“计算列”感觉更类似于Excel。尤其是当我们对使用excel方面很在行的时候。
1 什么是计算列?
计算列在刷新时进行处理,并存储在数据库中。因此,如果转到“数据”选项卡,你将看到物理列添加到模型中的现有表中。由于计算列是物理存储在数据库中的,这意味着它们消耗磁盘,更重要的是消耗宝贵的内存,我们应该始终有效地保存和使用这些内存。此外,计算列对“行上下文”进行操作,“行上下文”是一种求值上下文,它在迭代机制上工作,迭代机制从放置计算列的表的第一行开始,对每一行的表达式求值,直到它到达最后一行。
2 什么是衡量标准?
在交互点处理度量值,因此当“度量值”添加到Power BI画布上的可视对象时。这意味着它没有存储在数据库中,因此不会像“计算列”那样消耗内存。但是,由于度量是在交互点处理的,因此它们将消耗CPU。此外,度量使用另一种类型的计算上下文,即“筛选上下文”。这种类型的求值上下文是指应用于基础模型中的表的筛选,该筛选实际上会影响度量的结果。我们提到了计算列和度量值的不同类型的计算上下文。为了更好地理解DAX的编写和度量与计算列的行为,理解计算上下文的概念是非常重要的。
我们应该对度量值使用“计算列”提出质疑的原因是两个因素的结合。
首先,当需要向模型添加额外数据时,“计算列”几乎是默认选择。其次,计算列由于物理存储在数据库中而消耗内存。因此,我们最终得到的是Power BI解决方案,该解决方案具有数十或数百个计算列,这些列消耗内存。这是质疑是否应使用计算列的核心原因。我们可以改用度量吗?这样做将减少内存消耗,提高刷新时间,并可以将Power BI解决方案发布到以前超过1GB限制(Pro许可)的服务。
秘诀六 禁用自动日期/时间
你可能不知道,但是对于Power Query中或派生并加载到Power BI模型的每个日期列,都会在后台自动生成日期表。现在,很多人不知道这一点是可以理解的,毕竟这些表在Power BI Desktop中是不可见的。生成这些自动生成的日期表的原因是为了支持报表中的时间智能功能,并提供聚合、筛选和钻取日期属性年、季、月和日的功能。
通过Power BI生成这些表时,将在自动生成的表中的日期列与模型中的初始表中的日期列之间建立关系。但是,在Power BI Desktop中同样看不到这些。此外,由于保存了最小和最大日期之间的所有可能的日期值,因此这些日期表可以保存大量记录。例如,在上表中,我们有'DateOfEvolution'列,其中保存着最小日期25/01/1996和最大日期02/05/2018,这意味着我们将有8,133行,它们都是最小和最大之间的日期。所有这些表都消耗内存,因此我们应该考虑禁用此功能。为了识别这些表,我们可以使用VertiPaq Analyzer或DAX Studio。通过使用Dax Studio建立与Power BI模型的连接,我们将看到具有“LocalDateTable”前缀的自动生成的表:
想象一下,有一个非常大的模型,并且模型中的每个表都由数据列组成,每个数据列的最小日期和最大日期之间的范围很广。这将增加内存消耗。过去禁用此功能非常令人沮丧,因为每个启动的Power BI Desktop都需要完成此功能。但是,自2019年5月以来(小悦认为),已将禁用自动生成的日期表添加到了全局设置中,这意味着一旦禁用,它将应用于未来推出的任何Power BI解决方案。要禁用此功能,请在Power BI Desktop中单击“文件”,依次选择“选项和设置”,“选项”,然后在“全局设置”下选择“数据加载”,然后取消选择“自动日期/时间”选项,如下图所示:
秘诀七 禁用后台数据预览下载
当我们使用Power Query时,前1000行存储在内存中,这将显示数据的预览。当使用由Power Query中的多个查询组成的大型模型时,这可能会引起一些性能问题。过去,在研究一个具有多个查询的Power BI解决方案中,当触发完整的模型刷新时,该查询在所有查询中始终落后于“评估”状态。由于没有任何查询移动到“加载查询”状态,因此处于无响应状态,这导致强制Power BI桌面关闭。这是当我们开始尝试使用选项“允许后台预览数据在后台下载”时,该选项一经禁用,就大大提高了性能,因为以前停留在“评估”状态的所有查询都开始成功加载,并且没有完全刷新的延迟。据了解,发生这种情况的原因是由于完整的模型刷新不仅触发了查询加载,而且还触发了数据预览在后台加载,因此消耗了更多资源。为了防止下载这些预览,我们可以直接在Power BI Desktop中取消选择“允许数据预览在后台下载”功能,方法是单击“文件”,“选项和设置”,“选项和当前文件”,如下图所示:
秘诀八 整数前的字符串
通过选择所需的数据连接器和连接类型将数据吸收到Power BI中之后,你可以选择使用Power Query应用转换并将数据成形为所需格式。下一步是处理数据,因此将数据加载到Power Pivot,Power Pivot是一个内存中的列数据库,用于存储模型和压缩引擎VertiPaq的工作。VertiPaq引擎(也称为xVelocity)执行三种压缩类型以减少总体内存消耗:值编码,字典(Hash)编码和行级编码(RLE)。下面将重点介绍其中的两个(值编码、字典编码),因为它们是理解为什么我们应该在Power BI中针对字符串使用整数的关键。
1 编值码
这就是通过VertiPaq引擎在内存中减少列的方法,该引擎标识列中的最小值,并用该最小值减去所有其他值。例如,在下图中,我们可以看到列“Units”栏中的最小值是20,因此第一行25个单位将变成5个单位(25-20),第二行50个单位将变成30个单位(50-30),第三行40个单位将变成20个单位(40-20)等等。因此,它正在减少位数,即消耗的位数。在查询期间,为了检索正确的单位数,VertiPaq引擎只需将最小值加回到最初减去的数量上。一个很重要的说明,很明显,就是“值编码”仅适用于整数值。要记住这一点很重要。
2 字典编码
这是通过VertiPaq Engine创建包含两个列的数据字典表来减少内存中具有字符串值的列的方式:
-
一个独特的ID列,用于唯一地标识每个字符串值
-
包含字符串值的列
创建数据字典表后,会将数据字典中与众不同的ID引用到原始列中的值。如果你曾经使用VertiPaq Analyser来优化你的解决方案,那么你将看到一个叫做“字典大小”的东西,它就是这样的。一个重要的注意事项是理解列中的基数越高,数据字典中的内存消耗就越大。
因此,在这里强调了上面的内容之后,我们应该旨在在字符串值上使用整数,因为我们将推广值编码,这不会创建消耗更多空间的数据字典表。
秘诀九 使用查询缩减功能(切片器,过滤器和交叉突出显示)
借助所有先前的性能技巧,它们更多地基于将Import作为连接类型使用,因此基于内存模式,而此性能技巧将更多地关注Direct Query。如果你使用的是Direct Query,并且已尽可能地优化了基础数据库,但仍需要额外的性能,则值得尝试一下。通过Direct Query,可以在报表使用者与报表进行交互时生成查询,并将查询发送到数据库,方法是在切片器中选择一个值,在柱形图中选择条形图之一,使用过滤器或其他方法。这会造成瓶颈,尤其是当你有大量用户与Power BI报表进行交互时。这就是“查询缩减”发挥作用的时候,因为它提供了将“切片器”和“过滤器”中的各种选择组合为单个查询的功能,而不是为每个选择生成单个查询的功能。例如,如果我们从“区域切片器”中选择值“东”,则立即将单个查询发送到数据库,而一旦选择值“北”,则将第二个查询发送到数据库。
通过减少查询,只有通过选择“应用”按钮确认查询后,查询才会发送到基础数据库,如下所示:
要对切片器(或过滤器)应用查询减少,请在Power BI Desktop中选择“文件”,“选项和设置”,“选项”,“查询缩减”,然后启用“向每个切片器添加应用按钮以在读取时应用更改”,如下所示:下面说明:
减少查询功能不仅限于切片器和过滤器,还可以选择“默认情况下禁用交叉突出显示/过滤”框。这样可以防止屏幕上的视觉效果充当其他视觉效果的过滤器,同样,从视觉效果中选择元素会自动过滤其他视觉效果,因此会生成对数据库的基础查询。如果不需要,请继续将其关闭,或者至少减少默认情况下启用的交叉突出显示/过滤的数量。
秘诀十 在DAX中使用变量
在编写DAX时,我们应该始终使用变量而不是度量本身,因为它们提高了可读性和调试过程,降低了DAX的复杂性,并具有通过停止运行来提高性能的能力。多次重新计算的结果。因此,通过将计算定义为变量的一部分,一旦计算发生,结果就会存储在变量中。
TY vs PY Var%=
除法(
[ TY销售] - 计算([ TY销售] ,SAMEPERIODLASTYEAR (“零售2” [ 日期] )),
计算([ TY销售] ,SAMEPERIODLASTYEAR ('零售2' [ 日期] ))
)
上面的公式是一种非常常见的方法,我们可以找到在实际值和目标值之间计算出的“差异百分比”,在这种情况下,这是当前的年度销售额与上一年度的销售额。从上面的公式可以看到,计算上一年度销售额的度量重复了两次,因此需要重新计算。使用迭代器函数时,效率可能会更高,但是无论如何在这种情况下,我们都可以将前年度销售额添加到一个变量中,该变量可以返回期望的结果,但所需的时间更少。
TY vs PY Var%=
VAR PreviousYearSales =
计算([ TY销售] ,SAMEPERIODLASTYEAR ('零售2' [ 日期] ))
返回
除法([ TY销售] -PreviousYearSales ,PreviousYearSales )
这就是十大Power BI性能提升的秘密武器。小悦希望大家发现这些有用的东西,并开始在你的Power BI开发过程中使用它们,因为它们肯定会产生对Power BI一些问题的答案,为你的组织和报告消费者提供更高质量的体验。
此外,小悦建议大家开始使用VertiPaq Analyzer了解底层解决方案中模型的实际内存消耗,并使用DAX Studio了解DAX公式的性能。请继续关注第3部分,在这里我们将开始探索前10个Power BI最佳实践技巧。
推荐阅读
1.Power BI免费下载:http://www.yeacer.com/
Microsoft Power BI Desktop中文最新版:下载地址
2.欢迎加入的Power BI技术群,目前正在学习阶段,有兴趣的朋友可以一起学习讨论。
Power Data技术交流群:702966126 (验证注明:博客园Power BI)
更多精彩内容请关注微信公众号:悦策PowerBI
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,作者博客:https://www.cnblogs.com/yeacer/