Power Query 中的查询评估和查询折叠概述

本文概述了如何处理 M 查询并将其转换为数据源请求。

Power Query M 脚本

任何查询(无论是由 Power Query 创建、由高级编辑器手动编写还是使用空白文档输入)都由 Power Query M 公式语言中的函数和语法组成。 Power Query 引擎会对此查询进行解释和评估,以输出其结果。 M 脚本是评估查询所需的指令集。

提示

可以将 M 脚本视为描述如何准备数据的配方。

创建 M 脚本的最常见方法是使用 Power Query 编辑器。 例如,连接到数据源(如 SQL Server 数据库)时,屏幕右侧会显示名为“已应用步骤”的部分。 本部分显示查询中使用的所有步骤或转换。 从这个意义上说,Power Query 编辑器就是一个接口,可帮助你为之后的转换创建适当的 M 脚本,并确保所使用的代码有效。

注意

Power Query 编辑器中使用 M 脚本可以:

  • 将查询显示为一系列步骤,并允许创建或修改新步骤。
  • 显示关系图视图。

“已应用的步骤”和数据预览视图的图像。

上图强调已应用步骤部分,其中包含以下步骤:

  • :建立与数据源的连接。 在本例中,它是与 SQL Server 数据库的连接。
  • 导航:导航到数据库中的特定表。
  • 删除其他列:从表中选择要保留的列。
  • 已排序的行:使用一个或多个列对表排序。
  • 保留前几行:筛选表,仅保留表顶部一定数量的行。

这组步骤名称可帮助你查看 Power Query 为你创建的 M 脚本。 有几种方法可以查看完整的 M 脚本。 在 Power Query 中,可以在“视图”选项卡中选择“高级编辑器”。还可以从“主页”选项卡中的“查询”组中选择“高级编辑器”。在某些版本的 Power Query 中,还可以通过转到“视图”选项卡并从“布局”组中选择“脚本视图>查询脚本”,更改编辑栏视图以显示查询脚本。

图像,其中显示完整 M 脚本和“已应用的步骤”的相应名称。

在“已应用步骤”窗格中找到的大多数名称也在 M 脚本中按原样使用。 在 M 语言中,查询步骤的名称被称为标识符。 在 M 语言中,有时会在步骤名称周围加上额外的字符,但这些字符不会显示在应用步骤中。 例如 #"Kept top rows",由于这些额外的字符,被归类为带引号的标识符。 带引号的标识符可用于将零个或多个 Unicode 字符的任何序列用作标识符,包括关键字、空格、注释、运算符和标点符号。 若要详细了解 M 语言中的标识符,请转到词法结构

通过 Power Query 编辑器对查询所做的任何更改都会自动更新查询的 M 脚本。 例如,以前面的图像作为起点,如果将“保留前几行”步骤名称更改为“前 20 行”,则此更改将在脚本视图中自动更新。

图像,其中“已应用的步骤”名称已更改为“前 20 行”,此更改也更新了 M 脚本。

虽然我们建议使用 Power Query 编辑器为你创建全部或大部分 M 脚本,但也可以手动添加或修改 M 脚本的片段。 若要了解有关 M 语言的详细信息,请转到 M 语言的官方文档网站

注意

M 脚本(也称为 M 代码)是用于任何使用 M 语言代码的术语。 在本文中,M 脚本还指 Power Query 查询中找到的代码,可以通过高级编辑器窗口或编辑栏中的脚本视图进行访问。

Power Query 中的查询评估

下图探讨了在 Power Query 中计算查询时发生的过程。

查询评估关系图概述。

  1. 在高级编辑器中找到的 M 脚本将提交到 Power Query 引擎。 还包括其他重要信息,例如凭据和数据源隐私级别。
  2. Power Query 确定需要从数据源中提取哪些数据,并向数据源提交请求。
  3. 数据源通过将请求的数据传输到 Power Query 来响应来自 Power Query 的请求。
  4. Power Query 从数据源接收传入数据,并在必要时使用 Power Query 引擎进行任何转换。
  5. 从上一个点得到的结果将加载到目标。

注意

虽然本例展示了将 SQL 数据库作为数据源的查询,但该概念适用于具有或不带数据源的查询。

Power Query 读取 M 脚本时,会通过优化过程运行该脚本,以便更有效地评估查询。 在此过程中,它会确定可将查询中的哪些步骤(转换)卸载到数据源。 它还确定需要使用 Power Query 引擎评估哪些其他步骤。 此优化过程称为查询折叠,其中 Power Query 视图将尽可能多的执行推送到数据源以优化查询执行。

重要

需要遵循 Power Query M 公式语言(也称为 M 语言)的所有规则。 最值得注意的是,延迟评估在优化过程中发挥着重要作用。 在此过程中,Power Query 了解需要评估查询的特定转换。 Power Query 还了解哪些其他转换不需要评估,因为这些转换不需要放在查询的输出中。

此外,当涉及多个源时,评估查询时会考虑每个数据源的数据隐私级别。 详情请见:数据隐私防火墙的幕后工作

下图演示了在此优化过程中各个步骤。

用于说明优化流程的查询评估关系图。

  1. 在高级编辑器中找到的 M 脚本将提交到 Power Query 引擎。 还提供其他重要信息,例如凭据和数据源隐私级别。
  2. 查询折叠机制会将元数据请求提交到数据源,以确定数据源功能、表架构、数据源中不同表之间的关系等。
  3. 根据收到的元数据,查询折叠机制会确定要从数据源中提取哪些信息,以及需要在 Power Query 引擎中执行哪些转换集。 它将指令发送到另外两个组件,这两个组件负责从数据源检索数据,并在必要时在 Power Query 引擎中转换传入的数据。
  4. Power Query 的内部组件收到指令后,Power Query 会使用数据源查询向数据源发送请求。
  5. 数据源接收来自 Power Query 的请求,并将数据传输到 Power Query 引擎。
  6. 数据进入 Power Query 后,Power Query 中的转换引擎(也称为糅合引擎)将执行无法折叠或卸载到数据源的转换。
  7. 从上一个点得到的结果将加载到目标。

注意

Power Query 会根据 M 脚本中使用的转换和数据源,决定是对输入数据进行流式处理还是缓冲处理。

查询折叠概述

查询折叠的目标是将查询评估的大部分工作卸载或推送到可以计算查询转换的数据源。

查询折叠机制通过将 M 脚本转换为数据源可以解释和执行的语言来实现这一目标。 然后,它将评估推送到数据源,并将该评估的结果发送到 Power Query。

与从数据源中提取所有所需数据并在 Power Query 引擎中运行所有转换相比,这种操作通常能更快地执行查询。

使用获取数据体验时,Power Query 会引导你完成最终连接到数据源的过程。 在此过程中,Power Query 会使用 M 语言中分类为访问数据函数的一系列函数。 这些特定函数使用机制和协议通过数据源可以理解的语言连接到数据源。

但是,查询中的后续步骤是查询折叠机制尝试优化的步骤或转换。 然后,它会检查这些步骤是否可以卸载到数据源,而不是使用 Power Query 引擎进行处理。

重要

所有数据源函数(通常显示为查询的步骤)以其本机查询数据源中的数据。 查询折叠机制用于在数据源函数后应用于查询的所有转换,因此可以将这些转换转换和组合为单个数据源查询或卸载到数据源的任意多个转换。

根据查询的结构,查询折叠机制可能有三种可能的结果:

  • 完整查询折叠:当所有查询转换被推送回数据源,并在 Power Query 引擎中进行最小处理时。
  • 部分查询折叠:仅当查询中只有少数转换(而不是全部)可以推送回数据源。 在这种情况下,只有一部分转换在数据源中完成,其余查询转换发生在 Power Query 引擎中。
  • 无查询折叠:当查询包含无法转换为数据源的本机查询语言的转换时,要么因为不支持转换,要么连接器不支持查询折叠。 在这种情况下,Power Query 从数据源获取原始数据,并使用 Power Query 引擎通过处理 Power Query 引擎级别的所需转换来实现所需的输出。

注意

查询折叠机制主要适用于结构化数据源的连接器,包括但不限于 Microsoft SQL ServerOData 源。 在优化阶段,引擎有时可能会对查询中的步骤重新排序。

利用具有更多处理资源和查询折叠功能的数据源可以加快查询加载时间,因为这样处理的是发生在数据源而不是 Power Query 引擎。

后续步骤

有关查询折叠机制的三种可能结果的详细示例,请转到查询折叠示例

若要了解在“已应用步骤”窗格中找到的查询折叠指示器,请转到“查询折叠指示器”