查看度量值、关系和视觉对象的性能

已完成

如果您的语义模型具有多个表、复杂的关系、精密的计算、多个视觉对象或冗余数据,则存在报表性能不佳的风险。 报表性能不佳会导致负面的用户体验。

为了优化性能,您必须首先确定问题的来源;换句话说,找出导致性能问题的报表和语义模型元素。 之后,可以采取措施来解决这些问题,从而提高性能。

确定报表性能瓶颈

为了使报表获得最佳性能,您需要创建一个可快速运行查询和度量值的高效语义模型。 有了这个良好的基础,你就可以通过分析查询计划和依赖项并进行更改,进一步优化性能,从而改进模型。

您应该检查语义模型中的度量值和查询,以确保使用最高效的方式来获得想要的结果。 应首先确定代码中存在的瓶颈。 当您在语义模型中识别出速度最慢的查询时,可以首先关注最大的瓶颈,并建立优先级列表来解决其他问题。

分析性能

您可以使用 Power BI Desktop 中的性能分析器来了解每个报表元素在用户与其交互时的表现。 例如,可以确定在由用户交互启动时,视觉对象刷新所用的时间。 性能分析器可帮助确定导致性能问题的元素,这在故障排除过程中非常有用。

运行性能分析器之前,若要确保在分析(测试)中获得最准确的结果,请确保清除干净视觉对象缓存和数据引擎缓存后开始。

  • 视觉对象缓存 - 加载视觉对象时,如果不关闭 Power BI Desktop 并再次打开,则无法清除此视觉对象缓存。 为了避免任何缓存的影响,需要清除干净视觉对象缓存后再开始分析。

    为了确保拥有干净的视觉对象缓存,请向您的 Power BI Desktop (.pbix) 文件添加一个空白页,然后选择该页面,保存并关闭文件。 重新打开要分析的 Power BI Desktop (.pbix) 文件。 它会在空白页上打开。

  • 数据引擎缓存 - 运行查询时,结果会进行缓存,因此分析的结果会产生误导。 重新运行视觉对象之前,需要清除数据缓存。

    要清除数据缓存,可以重新启动 Power BI Desktop 或将 DAX Studio 连接到语义模型,然后调用“清除缓存”。

清除缓存并在空白页上打开 Power BI Desktop 文件后,转到视图选项卡并选择性能分析器选项。

若要开始分析过程,请选择开始录制,选择要分析的报表页,并与要度量的报表元素进行交互。 在此过程中,交互的结果会显示在性能分析器窗格中。 完成后,选择停止按钮。

有关更多详细信息,请参阅使用性能分析器检查报表元素性能

查看结果

可以在性能分析器窗格中查看性能测试的结果。 若要按持续时间顺序(最长到最短)查看任务,请右键单击持续时间(毫秒) 列标题旁的排序图标,然后选择总时间并按降序顺序排列。

每个视觉对象的日志信息会显示完成以下类别的任务所花费的时间(持续时间):

  • DAX 查询 - 视觉对象发送查询所花费的时间,以及 Analysis Services 返回结果所花费的时间。

  • 视觉对象显示 - 视觉对象在屏幕上呈现所花费的时间,包括检索 Web 图像或地理编码所花费的时间。

  • 其他 - 视觉对象准备查询、等待其他视觉对象完成或执行其他后台处理任务所花费的时间。 如果此类别显示的持续时间很长,则真正能够缩短此持续时间的唯一方法是为其他视觉对象优化 DAX 查询,或减少报表中的视觉对象数量。

分析测试的结果可帮助您了解语义模型的行为并确定需要优化的元素。 可以比较报表中每个元素的持续时间,并确定持续时间较长的元素。 应重点关注这些元素,并调查它们在报表页上加载时间如此之长的原因。

若要更详细地分析查询,可以使用 DAX Studio,它是由其他服务提供的免费开放源代码工具。

解决问题并优化性能

分析的结果会确定需要改进的方面以及进行性能优化的机会。 您可能会发现需要对语义模型中的视觉对象、DAX 查询或其他元素进行改进。 以下信息提供有关要查找的内容以及可进行的更改的指导。

视觉对象

如果将视觉对象确定为导致性能不佳的瓶颈,则应找到一种方法来提高性能,同时尽可能减少对用户体验的影响。

考量报表页上的视觉对象数量;视觉对象越少,性能越好。 问问自己某个视觉对象是否确实需要,以及是否会为最终用户增加价值。 如果答案为否,则应删除该视觉对象。 不要在页面上使用多个视觉对象,而是考虑其他方法来提供附加详细信息,例如钻取页面和报表页面工具提示。

检查每个视觉对象中的字段数。 报表中的视觉对象越多,出现性能问题的可能性便越高。 此外,视觉对象越多,报表看起来就越拥挤,清晰度也会降低。 视觉对象的上限为 100 个字段(度量值或列),因此具有 100 多个字段的视觉对象会加载较慢。 问问自己是否确实需要视觉对象中的所有这些数据。 您可能会发现,当前使用的字段数其实可以适当减少。

DAX 查询

当您在性能分析器窗格中检查结果时,可以看到 Power BI Desktop 引擎评估每个查询所花费的时间(以毫秒为单位)。 我们首先找到花费时间超过 120 毫秒的任何 DAX 查询。 在此示例中,您会发现一个具有较长持续时间的特定查询。

性能分析器会突出显示潜在问题,但并不指出需要执行哪些操作来改善这些问题。 您可能要进一步调查此度量值花费如此长时间进行处理的原因。 可以使用 DAX Studio 更详细地调查查询。

例如,选择复制查询以将计算公式复制到剪贴板中,然后将它粘贴到 Dax Studio 中。 随后可以更详细地查看计算步骤。 在此示例中,您将尝试统计订单数量大于或等于五的产品总数。

Count Customers =
CALCULATE (
    DISTINCTCOUNT ( Order[ProductID] ),
    FILTER ( Order, Order[OrderQty] >= 5 )
)

分析查询之后,可以使用自己的知识和经验来确定出现性能问题的位置。 您还可以尝试使用不同的 DAX 函数,以查看它们是否可提高性能。 在下面的示例中,FILTER 函数替换为 KEEPFILTER 函数。 在性能分析器中再次运行测试时,持续时间由于使用了 KEEPFILTER 函数而缩短。

Count Customers =
CALCULATE (
    DISTINCTCOUNT ( Order[ProductID] ),
    KEEPFILTERS (Order[OrderQty] >= 5 )
)

在这种情况下,可以将 FILTER 函数替换为 KEEPFILTER 函数,以显著减少此查询的计算持续时间。 进行此更改时,若要检查持续时间是否得到改进,请清除数据缓存,然后重新运行性能分析器进程。

语义模型

如果度量值和视觉对象的持续时间显示较低值(换句话说,其持续时间较短),则它们不是产生性能问题的原因。 相反,如果 DAX 查询显示较长的持续时间值,则可能是度量值写得不好或语义模型出现了问题。 此问题可能是由模型中的关系、列或元数据所导致,也可能是自动日期/时间选项的状态,如下一部分中所述。

关系

应查看表之间的关系,以确保建立了正确的关系。 检查是否正确配置了关系基数属性。 例如,包含唯一值的单端列可能会错误地配置为多端列。 本模块的后文中将详细介绍基数如何影响性能。

最佳做法是不导入不需要的数据列。 为了避免删除 Power Query 编辑器中的列,应该尝试在将数据加载到 Power BI Desktop 前在源端对其进行处理。 然而,如果无法从源查询中删除冗余列或数据已以原始状态导入,则始终可以使用 Power Query 编辑器对每一列进行检查。 问问自己是否真的需要每一列,并尝试确定每一列为您的语义模型带来的好处。 如果您发现某一列没有任何价值,那么应该将其从语义模型中删除。 例如,假设有一个 ID 列,其中包含数千个唯一行。 您知道不会在关系中使用此特定列,因此不会在报表中使用它。 因此,您应该认为此列是不必要的,并承认它在您的语义模型中浪费了空间。

删除不需要的将减小语义模型的大小,从而减小文件大小并缩短刷新时间。 而且,由于语义模型仅包含相关数据,因此整体报表性能将得到提高。

有关详细信息,请参阅导入建模时减少数据的方法

元数据

元数据是有关其他数据的信息。 Power BI 元数据包含有关语义模型的信息,例如每列的名称、数据类型和格式、数据库的架构、报表设计、文件的最后修改时间、数据刷新率等等。

当您将数据加载到 Power BI Desktop 后,分析相应的元数据是一种很好的做法,这样您就可以识别出与您语义模型的任何不一致之处,并在开始构建报表之前对数据进行规范化处理。 对元数据运行分析将提高语义模型的性能,因为在分析元数据时,您将识别不需要的列、数据中的错误、不正确的数据类型、正在加载的数据量(大型语义模型,包括事务或历史数据,将需要更长时间才能加载)等等。

可以使用 Power BI Desktop 中的 Power Query 编辑器来检查原始数据的列、行和值。 随后可以使用可用的工具(如以下屏幕截图中突出显示的工具)进行必要的更改。

Power Query 选项包括:

  • 不需要的列 - 评估是否需要每个列。 如果一个或多个列不会在报表中使用,则它们是不需要的列,应使用主页选项卡上的删除列选项来将其删除。

  • 不需要的行 - 检查语义模型中的前几行,看它们是否为空,或者是否包含报表中不需要的数据;如果是,则使用开始选项卡上的删除行选项来删除这些行。

  • 数据类型 - 评估列数据类型以确保每种都正确。 如果确定数据类型不正确,请更改它,具体方法是选择列,选择转换选项卡上的数据类型,然后从列表中选择正确的数据类型。

  • 查询名称 - 检查查询窗格中的查询(表)名称。 正如对列标题名称执行的操作一样,应将不常见或无用的查询名称更改为更明显的名称或用户更熟悉的名称。 可以重命名查询,具体方法是右键单击该查询,选择重命名,根据需要编辑名称,然后按 Enter

  • 列详细信息 - Power Query 编辑器具有以下三个数据预览选项,您可以使用它们来分析与列相关的元数据。 如以下屏幕截图中所示,可以在视图选项卡上找到这些选项。

    • 列质量 - 确定列中有效、出现错误或为空的项的百分比。 如果有效百分比不是 100,则应调查原因、更正错误并填充空值。

    • 列分布 - 显示每列中值的频率和分布。 您将在本模块的稍后部分进一步调查此内容。

    • 列配置文件 - 显示列统计图和列分布图。

注意

如果您正在查看一个包含超过 1,000 行的大型语义模型,并且想要分析整个语义模型,则需要更改窗口底部的默认选项。 选择基于前 1,000 行的列分析 > 基于整个数据集的列分析

您应该考虑的其他元数据包括有关整个语义模型的信息,例如文件大小和数据刷新率。 可以在关联的 Power BI Desktop (.pbix) 文件中找到此元数据。 您加载到 Power BI Desktop 的数据将被 VertiPaq 存储引擎压缩并存储到磁盘。 语义模型的大小直接影响其性能;大小较小的语义模型使用更少的资源(内存)并可实现更快的数据刷新、计算,更快呈现报表中的视觉对象。

自动日期/时间功能

优化性能时可以考虑使用的另一种方法是 Power BI Desktop 中的自动日期/时间选项。 默认情况下,此功能是全局启用的,这意味着只要满足某些条件,Power BI Desktop 就会自动为每个日期列创建一个隐藏的计算表。 新的隐藏表是对您的语义模型中已有表的补充。

通过自动日期/时间选项,可以在对日历时间段进行筛选、分组和向下钻取时使用时间智能。 建议仅当处理日历时间段时,以及具有的与时间相关的模型要求过于简单时,才使自动日期/时间选项保持启用状态。

如果数据源已定义日期维度表,则应使用该表一致地定义组织中的时间,并且应禁用全局自动日期/时间选项。 禁用此选项可以减小语义模型的大小并缩短刷新时间。

您可以全局启用/禁用自动日期/时间选项,以使其应用于您所有的 Power BI Desktop 文件,或者可以为当前文件启用/禁用此选项,以使其仅适用于单个文件。

要启用/禁用此自动日期/时间选项,请转到文件 > 选项和设置 > 选项,然后选择全局当前文件页面。 在任一页上,选择数据加载,然后在时间智能部分中,根据需要选中或取消选中复选框。

有关自动日期/时间功能的概述和一般介绍,请参阅在 Power BI Desktop 中应用自动日期/时间