Power Query 的查询计划是一项功能,可用于更好地查看查询的评估结果。 此功能有助于确定特定查询在特定步骤中可能不折叠的原因。
本文通过实际示例演示了使用查询计划功能查看查询步骤的主要用例和潜在优势。 本文中使用的示例是使用适用于 Azure SQL Server 的 AdventureWorksLT 示例数据库创建的,可以从 AdventureWorks 示例数据库下载该数据库。
注释
Power Query 的查询计划功能仅在 Power Query Online 中可用。
本文分为一系列建议步骤,用于解释查询计划。 以下步骤包括:
使用以下步骤在自己的 Power Query Online 环境中创建查询。
从“Power Query - 选择数据源”,选择“空白查询”。
将空白查询的脚本替换为以下查询。
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"
使用自己环境的正确名称更改
servername
和database
。(可选)如果尝试连接到本地环境的服务器和数据库,请确保为该环境配置网关。
选择下一步。
在 Power Query 编辑器中,选择 配置连接 并提供数据源的凭据。
注释
有关连接到 SQL Server 的详细信息,请转到 SQL Server 数据库。
执行这些步骤后,查询将如下图所示。
此查询连接到 SalesOrderHeader 表,并从最后五个订单中选择几个列,其中 TotalDue 值超过 1000。
注释
本文使用简化的示例来展示此功能,但本文中所述的概念适用于所有查询。 建议在阅读查询计划之前仔细了解查询折叠。 若要了解有关查询折叠的详细信息,请转到 查询折叠基础知识。
1.查看查询折叠指示器
注释
阅读本部分之前,建议查看有关查询折叠指示器的文章。
此过程的第一步是查看查询并密切关注查询折叠指示器。 目标是查看标记为未折叠的步骤。 然后,你可以看看对整体查询进行更改是否可能会使这些转换完全合并。
在本示例中,无法折叠的唯一步骤是“保留底部几行”,此步骤很容易通过“未折叠的”步骤指示器进行识别。 此步骤也是查询的最后一步。
现在的目标是查看此步骤,了解要折叠回数据源的内容以及无法折叠的内容。
2.选择查询步骤以查看其查询计划
你已将“保留底部几行”步骤标识为感兴趣的步骤,因为它不会折叠回数据源。 右键单击该步骤,然后选择“查看查询计划”选项。 此操作将显示一个新对话框,其中包含所选步骤的查询计划图。
Power Query 尝试利用延迟计算和查询折叠来优化查询,如查询折叠基础知识中所述。 此查询计划表示将 M 查询优化转换未本机查询以发送到数据源。 它还包括 Power Query Engine 执行的任何转换。 节点显示的顺序遵循查询的顺序,从查询的最后一步或输出开始,该步骤或输出在关系图最左侧表示。 在本例中,它是 Table.LastN 节点,表示“保留底部几行”步骤。
在对话框底部,有一个带有图标的条形图,可帮助你放大或缩小查询计划视图,以及其他按钮来帮助你管理视图。 在上图中,此栏中的“适应视图”选项用于更好地查看节点。
注释
查询计划表示优化的计划。 当引擎评估查询时,它会尝试将所有运算符折叠到数据源中。 在某些情况下,它甚至可能会对步骤进行一些内部重新排序以最大化折叠。 考虑到此过程,此优化查询计划中留下的节点/运算符通常包含“已折叠的”数据源查询。 无法折叠的任何运算符都会在本地进行评估。
识别折叠节点并区分其他节点
可以将此关系图中的节点标识为两个组:
- 折叠节点:此节点可以是
Value.NativeQuery
节点或“数据源”节点,例如Sql.Database
。 还可以使用标签 远程 在其函数名称下标识这些节点。 - 非折叠节点:其他表运算符,如
Table.SelectRows
、Table.SelectColumns
和其他无法折叠的函数。 这些节点还可以使用标签 "完全扫描" 和 "流式处理" 进行标识。
下图显示了红色矩形内的折叠节点。 无法将其余节点折叠回数据源。 需要查看其余节点,因为目标是尝试让这些节点折叠回数据源。
可以在某些节点底部选择“查看详细信息”以显示扩展信息。 例如,
Value.NativeQuery
节点的详细信息显示发送到数据源的本机查询(在 SQL 中)。
此处显示的查询可能与发送到数据源的查询不完全相同,但它是一个很好的近似值。 对于这种情况,系统会准确地告诉你从 SalesOrderHeader 表中查询了哪些列。 然后,它如何使用 TotalDue 字段筛选该表,以仅获取该字段的值大于 1000 的行。 它旁边的节点(Table.LastN)由 Power Query 引擎在本地计算,因为它无法折叠。
注释
运算符可能与查询脚本中使用的函数不完全匹配。
查看非折叠节点,并考虑折叠转换的操作
现在,你已确定哪些节点无法折叠,并且可以在本地进行评估。 这种情况只有 Table.LastN
节点,但在其他情况下,它可能有更多的节点。
目标是将更改应用于查询,以便可以折叠步骤。 你可能实施的一些更改包括从重新排列步骤到将替代逻辑应用到对数据源更清晰的查询。 这并不意味着所有查询和所有操作都可以通过应用一些更改来变得可折叠。 但是,最好通过试验和错误来确定是否可以折叠回查询。
由于数据源是 SQL Server 数据库,因此如果目标是从表中检索最后五个订单,一种好的方法是利用 SQL 中的 TOP 和 ORDER BY 子句。 由于 SQL 中没有 BOTTOM 子句,因此 PowerQuery 中的 Table.LastN
转换无法转换为 SQL。 可以删除 Table.LastN
步骤并将其替换为:
- 表中 SalesOrderID 列的降序步骤,因为此列确定哪个订单在最前,哪个订单在最后。
- 在表排序以后选择前五行,此转换实现的效果与“保留底部几行”(
Table.LastN
) 相同。
此替代项等效于原始查询。 虽然理论上这种替代方法看起来不错,但你需要进行更改,看看此替代方法是否使此节点完全折叠回数据源。
3.实现对查询的更改
实现上一部分中讨论的替代方法:
关闭查询计划对话框并返回到 Power Query 编辑器。
删除“保留底部几行”步骤。
按降序对 SalesOrderID 列进行排序。
选择数据预览左上角的表格图标,然后选择显示“保留顶部行”的选项。 在对话框中,将数字 5 作为参数传递并按“确定”。
实现更改后,再次检查查询折叠指示器,并查看它是否提供折叠指示器。
现在查看最后一步的查询计划,现在 保留前几行。 现在只有折叠的节点。 选择 查看
Value.NativeQuery
下 的详细信息,以验证是否向数据库发送了查询。
虽然本文建议应用哪种替代方法,但主要目标是了解如何使用查询计划调查查询折叠。 这篇文章还介绍了要发送到数据源的内容以及在本地执行的转换。
可以调整代码以查看它在查询中的影响。 通过使用查询折叠指示器,还可以更好地了解哪些步骤阻止查询折叠。