为什么我的查询运行了多次?
在 Power Query 中刷新时,后台做了大量的工作,努力提供流畅的用户体验,并高效、安全地执行查询。 但是,在某些情况下,可能会注意到 Power Query 在刷新数据时会触发多个数据源请求。 有时这些请求是正常的,但有时是可以避免的。
下文将介绍 Power Query 向数据源发送多个请求时的一些实例。
连接器可以出于各种原因多次调用数据源,包括元数据、结果缓存、分页等。 此行为是正常的,其设计初衷就是如此。
如果多个查询从该数据源提取数据,则可能会对同一数据源发出多个请求。 即使只有一个查询引用数据源,也会出现这些请求。 如果一个或多个其他查询引用该查询,则独立计算每个查询以及其依赖的所有查询。
在桌面环境中,数据模型中所有表的单次刷新都使用单个共享缓存。 缓存可以减少对同一数据源发出多个请求的可能性,因为一个查询可以受益于已为不同查询运行和缓存的相同请求。 但即使在这里,你仍可能会收到多个请求,因为:
- 数据源未缓存(如本地 CSV 文件)。
- 由于下游操作(可能会改变折叠),对数据源的请求与已经缓存的请求不同。
- 缓存太小(这种情况不太可能发生)。
- 查询大致同时运行。
在云环境中,每个查询都使用其自己单独的缓存进行刷新。 因此,查询无法从已被缓存用于不同查询的同一请求中受益。
有时,Power Query 的折叠层可能会根据下游正执行的操作向数据源生成多个请求。 在这种情况下,可以使用 Table.Buffer
来避免多个请求。 详情请见:缓冲表
在 Power BI Desktop 中,Analysis Services (AS) 通过两个评估刷新数据:一个用于提取架构(AS 通过请求零行来实现),另一个用于提取数据。 如果计算零行架构需要提取数据,则可能出现重复的数据源请求。
数据隐私会对每个查询进行评估,以确定同时运行这些查询是否安全。 此评估有时可能会导致向数据源发出多个请求。 表明给定请求来自数据隐私分析的明显迹象是它具有“TOP 1000”条件(尽管并非所有数据源都支持这样的条件)。 通常,禁用数据隐私(假设可以接受)会消除刷新期间的“TOP 1000”或其他数据隐私相关请求。 详情请见:禁用数据隐私防火墙
与对数据隐私执行的评估类似,Power Query 编辑器默认会下载每个查询步骤的前 1,000 行的预览。 下载这些行有助于确保在选择步骤后立即显示数据预览,但也可能导致数据源请求重复。 详情请见:禁用后台分析
各种 Power Query 编辑器后台任务也可能触发额外的数据源请求(例如,查询折叠分析、列分析、Power Query 在将结果加载到 Excel 后触发的 1000 行预览自动刷新等)。
可以通过关闭查询过程的特定部分隔离多个查询实例,从而隔离重复请求的来源。 例如,如果启用:
- 在 Power Query 编辑器中
- 禁用防火墙
- 禁用后台分析
- 禁用列分析和任何其他后台任务
- [可选]执行
Table.Buffer
在此示例中,刷新 Power Query 编辑器预览时,将只进行单个 M 评估。 如果此时出现重复请求,那么就是查询编写方式的固有问题。 如果没有,并且逐个启用前面描述的设置,则可以观察重复请求开始出现的时间点。
以下各部分更详细地说明了这些步骤。
无需重新连接或重新创建查询,只需在 Power Query 编辑器中打开要测试的查询即可。 如果不想破坏现有查询,可以在编辑器中复制查询。
下一步是禁用数据隐私防火墙。 此步骤假定你不关心源之间的数据泄露问题,因此可以通过 Excel 中“设置快速合并”选项中所述的“始终忽略隐私级别”设置,或 Power BI Desktop 中 Power BI Desktop 隐私级别中所述的“忽略隐私级别并潜在提高性能”设置来禁用数据隐私防火墙。
恢复正常测试前,请务必撤消此步骤。
下一步是禁用后台分析。 后台分析由“允许数据预览并在后台下载”设置控制,相关描述可见于 Power BI 的“禁用 Power Query 后台刷新”。 你也可以在 Excel 中禁用此选项。
(可选)还可以用 Table.Buffer
强制读取所有数据,从而模仿加载过程中发生的情况。 若要在Power Query 编辑器中使用 Table.Buffer
:
在 Power Query 编辑器编辑栏中,选择 fx 按钮添加新步骤。
在编辑栏中,用 Table.Buffer 将上一步的名称包围(<上一步名称放在此处>)。 例如,如果上一步命名为
Source
,则编辑栏将显示= Source
。 编辑编辑栏中的步骤显示= Table.Buffer(Source)
。
详情请见:Table.Buffer
若要运行测试,请在 Power Query 编辑器中刷新。