Power Query 的查询计划

Power Query 的查询计划是一项功能,可用于更好地查看查询的评估结果。 此功能有助于确定特定查询在特定步骤中可能不折叠的原因。

本文通过实际示例演示了使用查询计划功能查看查询步骤的主要用例和潜在优势。 本文中使用的示例是使用适用于 Azure SQL Server 的 AdventureWorksLT 示例数据库创建的,可以从 AdventureWorks 示例数据库下载该数据库。

注释

Power Query 的查询计划功能仅在 Power Query Online 中可用。

建议的流程是先通过查看查询折叠指示器来使用 Power Query 中的查询计划功能,然后查看所选步骤的查询计划,最后实施从查询计划中审阅所得的任何更改。

本文分为一系列建议步骤,用于解释查询计划。 以下步骤包括:

  1. 查看查询折叠指示器
  2. 选择查询步骤以查看其查询计划
  3. 实现对查询的更改

使用以下步骤在自己的 Power Query Online 环境中创建查询。

  1. 从“Power Query - 选择数据源”,选择“空白查询”

  2. 将空白查询的脚本替换为以下查询。

    let
      Source = Sql.Database("servername", "database"),
      Navigation = Source{[Schema = "Sales", Item = "SalesOrderHeader"]}[Data],
      #"Removed other columns" = Table.SelectColumns(Navigation, {"SalesOrderID", "OrderDate", "SalesOrderNumber", "PurchaseOrderNumber", "AccountNumber", "CustomerID", "TotalDue"}),
      #"Filtered rows" = Table.SelectRows(#"Removed other columns", each [TotalDue] > 1000),
      #"Kept bottom rows" = Table.LastN(#"Filtered rows", 5)
    in
      #"Kept bottom rows"
    
  3. 使用自己环境的正确名称更改 servernamedatabase

  4. (可选)如果尝试连接到本地环境的服务器和数据库,请确保为该环境配置网关。

  5. 选择下一步

  6. 在 Power Query 编辑器中,选择 配置连接 并提供数据源的凭据。

注释

有关连接到 SQL Server 的详细信息,请转到 SQL Server 数据库

执行这些步骤后,查询将如下图所示。

启用了查询折叠指示器的示例查询。 此查询连接到 SalesOrderHeader 表,并从最后五个订单中选择几个列,其中 TotalDue 值超过 1000。

注释

本文使用简化的示例来展示此功能,但本文中所述的概念适用于所有查询。 建议在阅读查询计划之前仔细了解查询折叠。 若要了解有关查询折叠的详细信息,请转到 查询折叠基础知识

1.查看查询折叠指示器

注释

阅读本部分之前,建议查看有关查询折叠指示器的文章。

此过程的第一步是查看查询并密切关注查询折叠指示器。 目标是查看标记为未折叠的步骤。 然后,你可以看看对整体查询进行更改是否可能会使这些转换完全合并。

“应用的步骤”窗格中的示例查询的查询折叠指示器。

在本示例中,无法折叠的唯一步骤是“保留底部几行”,此步骤很容易通过“未折叠的”步骤指示器进行识别。 此步骤也是查询的最后一步。

现在的目标是查看此步骤,了解要折叠回数据源的内容以及无法折叠的内容。

2.选择查询步骤以查看其查询计划

你已将“保留底部几行”步骤标识为感兴趣的步骤,因为它不会折叠回数据源。 右键单击该步骤,然后选择“查看查询计划”选项。 此操作将显示一个新对话框,其中包含所选步骤的查询计划图。

“查询计划”对话框显示了查询计划的关系图视图,其中包含通过线连接的节点。 Power Query 尝试利用延迟计算和查询折叠来优化查询,如查询折叠基础知识中所述。 此查询计划表示将 M 查询优化转换未本机查询以发送到数据源。 它还包括 Power Query Engine 执行的任何转换。 节点显示的顺序遵循查询的顺序,从查询的最后一步或输出开始,该步骤或输出在关系图最左侧表示。 在本例中,它是 Table.LastN 节点,表示“保留底部几行”步骤

在对话框底部,有一个带有图标的条形图,可帮助你放大或缩小查询计划视图,以及其他按钮来帮助你管理视图。 在上图中,此栏中的“适应视图”选项用于更好地查看节点

查询计划对话框,其中节点已放大,以便获得更好的视图。

注释

查询计划表示优化的计划。 当引擎评估查询时,它会尝试将所有运算符折叠到数据源中。 在某些情况下,它甚至可能会对步骤进行一些内部重新排序以最大化折叠。 考虑到此过程,此优化查询计划中留下的节点/运算符通常包含“已折叠的”数据源查询。 无法折叠的任何运算符都会在本地进行评估。

识别折叠节点并区分其他节点

可以将此关系图中的节点标识为两个组:

  • 折叠节点:此节点可以是 Value.NativeQuery 节点或“数据源”节点,例如 Sql.Database。 还可以使用标签 远程 在其函数名称下标识这些节点。
  • 非折叠节点:其他表运算符,如 Table.SelectRowsTable.SelectColumns和其他无法折叠的函数。 这些节点还可以使用标签 "完全扫描" 和 "流式处理" 进行标识。

下图显示了红色矩形内的折叠节点。 无法将其余节点折叠回数据源。 需要查看其余节点,因为目标是尝试让这些节点折叠回数据源。

对话框底部的查询计划视图控件,其中选择了“适应视图”选项。 可以在某些节点底部选择“查看详细信息”以显示扩展信息。 例如,Value.NativeQuery 节点的详细信息显示发送到数据源的本机查询(在 SQL 中)。

查询计划中 Value.NativeQuery 节点的详细信息视图。 此处显示的查询可能与发送到数据源的查询不完全相同,但它是一个很好的近似值。 对于这种情况,系统会准确地告诉你从 SalesOrderHeader 表中查询了哪些列。 然后,它如何使用 TotalDue 字段筛选该表,以仅获取该字段的值大于 1000 的行。 它旁边的节点(Table.LastN)由 Power Query 引擎在本地计算,因为它无法折叠。

注释

运算符可能与查询脚本中使用的函数不完全匹配。

查看非折叠节点,并考虑折叠转换的操作

现在,你已确定哪些节点无法折叠,并且可以在本地进行评估。 这种情况只有 Table.LastN 节点,但在其他情况下,它可能有更多的节点。

目标是将更改应用于查询,以便可以折叠步骤。 你可能实施的一些更改包括从重新排列步骤到将替代逻辑应用到对数据源更清晰的查询。 这并不意味着所有查询和所有操作都可以通过应用一些更改来变得可折叠。 但是,最好通过试验和错误来确定是否可以折叠回查询。

由于数据源是 SQL Server 数据库,因此如果目标是从表中检索最后五个订单,一种好的方法是利用 SQL 中的 TOPORDER BY 子句。 由于 SQL 中没有 BOTTOM 子句,因此 PowerQuery 中的 Table.LastN 转换无法转换为 SQL。 可以删除 Table.LastN 步骤并将其替换为:

  • 表中 SalesOrderID 列的降序步骤,因为此列确定哪个订单在最前,哪个订单在最后
  • 在表排序以后选择前五行,此转换实现的效果与“保留底部几行”(Table.LastN) 相同

此替代项等效于原始查询。 虽然理论上这种替代方法看起来不错,但你需要进行更改,看看此替代方法是否使此节点完全折叠回数据源。

3.实现对查询的更改

实现上一部分中讨论的替代方法:

  1. 关闭查询计划对话框并返回到 Power Query 编辑器。

  2. 删除“保留底部几行”步骤

  3. 按降序对 SalesOrderID 列进行排序。

    使用自动筛选菜单按降序对 SalesOrderID 列进行排序。

  4. 选择数据预览左上角的表格图标,然后选择显示“保留顶部行”的选项。 在对话框中,将数字 5 作为参数传递并按“确定”。

    使用表上下文菜单选择“保留顶部几行”转换,以仅保留前五行。

实现更改后,再次检查查询折叠指示器,并查看它是否提供折叠指示器。

所有查询折叠指示器均为绿色,并显示可以折叠。最终表提供相同的行,但顺序不同。 现在查看最后一步的查询计划,现在 保留前几行。 现在只有折叠的节点。 选择 查看 Value.NativeQuery 的详细信息,以验证是否向数据库发送了查询。

对查询进行更改后的新查询计划,该查询现在仅显示折叠节点,Value.NativeQuery 显示计算查询的完整 SQL 语句。

虽然本文建议应用哪种替代方法,但主要目标是了解如何使用查询计划调查查询折叠。 这篇文章还介绍了要发送到数据源的内容以及在本地执行的转换。

可以调整代码以查看它在查询中的影响。 通过使用查询折叠指示器,还可以更好地了解哪些步骤阻止查询折叠。