查询限制:委派和查询限制
了解委派
当 Power Fx 查询可以完全转换为可在数据源上运行的等效查询时,Power Apps 最适合后端数据源。 Power Apps 发送一个查询,数据源进行了解,在数据源上执行查询,然后查询结果会返回到 Power Apps。 例如,数据源可以执行筛选数据源上的数据操作,并仅返回满足筛选条件的行。 当此操作正确运行时,可以说查询委派给数据源执行查询工作。
但是,Power Fx 查询无法始终转换为针对所有数据源的等效查询。 例如,Dataverse 支持的查询功能比 Excel 更多。 Dataverse 支持“in”(成员身份)查询运算符,而 Excel 不支持。 如果查询使用数据源不支持的功能,则可以说查询不可委派。 通常,如果查询表达式的任何部分不可委派,则不委派查询的任何部分。
当查询不可委派时,Power Apps 仅从数据源中获取前 500 条记录,然后在查询中执行操作。 此限制可以提高到 2,000 个记录,更改限制Power Apps可以将结果大小限制为 500 个记录,让 Power Apps 保持良好性能。我们通过实验发现,大于这些规模的结果集通常会给您的应用和 Power Apps 带来性能问题。
但是,此限制可能是一个问题,因为如果数据源上的数据超过 500/2000 条记录,则查询可能会返回不正确的结果。 例如,考虑以下示例:您的数据源有 1000 万条记录,而您的查询需要处理最后一部分数据。 (例如,从“Z”开始的姓氏)但是,您的查询中包含一个不可委派的运算符(例如 distinct)。在这种情况下,您将仅获取前 500/2000 条记录,并且得到的结果不正确。
针对您的数据源使用可委派表创建 Power Fx 查询。 您只应使用可委派的查询函数。 若要让应用始终运行良好,同时要确保用户能够访问所需的全部信息,这是唯一的方式。
请注意,标识不可能委派的位置的委派警告。 如果处理的是小型数据集(不到 500 条记录),则可使用任何数据源和公式,因为当不能委派公式时,应用可以在本地处理数据。
备注
委派警告可帮助管理应用,使其得到正确的结果。 如果数据源中的数据超过 500 条记录并且不能委派函数,Power Fx 将使用蓝色下划线标记公式。
可委派的数据源
仅某些表格数据源支持委派。 如果数据源支持委派,其连接器文档会概括介绍该支持。 例如,这些表格数据源是最常用的,它们支持委派:
- Microsoft Dataverse 的 Power Apps 可委派函数和操作
- SharePoint 的 Power Apps 可委派函数和操作
- SQL Server 的 Power Apps 可委派函数和操作
- Salesforce 的 Power Apps 可委派函数和操作
导入的 Excel 工作簿(使用向应用添加静态数据数据源)、集合以及存储在上下文变量中的表不需要委派。 所有此类数据都已在内存中,可以应用完整的 Power Apps 语言。
委派函数
下一步是仅使用那些可以委派的公式。 下面提供的是可以委派的公式元素。 但是,数据源各不相同,并非所有数据源都支持所有这些元素。 请在具体公式中查看委派警告。
Filter 函数
可以委派 Filter、Search、First 和 LookUp。
在 Filter 和 LookUp 函数中,可以对表的列使用以下项来选择相应的记录:
- And(包括 &&)、Or(包括 ||)、Not(包括 !)
- In
备注
In is only delegated for columns on the base data source. 例如,如果数据源是客户表,则
Filter(Accounts, Name in ["name1", "name2"])
委派给数据源进行评估。 但是,Filter(Accounts, PrimaryContact.Fullname in ["name1", "name2"])
不会委派,因为全名列与客户列位于不同的表 (PrimaryContact) 上。 表达式在本地计算。 - =、<>、>=、<=、>、<
- +、-
- TrimEnds
- IsBlank
- StartsWith、EndsWith
- 所有记录中均相同的常量值,如控件属性和全局变量和上下文变量。
还可使用公式中对所有记录的求值结果都是一个常量值的某些部分。 例如,Left( Language(), 2 )、Date( 2019, 3, 31 ) 和 Today() 不依赖于记录的任何列,因此所有记录都会返回同一值。 这些值可以作为常数发送到数据源,不会阻止委派。
以上列表不包括这些值得注意的项:
- If
- *、/、Mod
- 列转换操作 Text、Value
- Concatenate(包括 &)
- ExactIn
- 字符串操作函数:Lower、Upper、Left、Mid、Len...
- 信号:Location、Acceleration、Compass...
- 可变函数:Rand...
- 集合
查询限制
查找级别
Power Apps 支持两个查找级别。 这意味着 Power Fx 查询表达式中最多可以有两个查找函数。 此限制是为了保持性能。 如果查询表达式包括查找,则 Power Apps 首先执行查询以获取基表。 然后,它执行第二个查询,以展开包含查找信息的第一个表。 我们最多支持再增加一个级别。 但是,在离线时,我们仅支持扩展一个查找级别。
表达式计算 - 实体的属性必须位于等式运算符的左侧“LHS”
将要比较的实体的属性放在方程左侧“LHS”的表达式中非常重要。 为了说明这一点,在下面的示例中,实体属性 'Business unit ID'.Name 是一个属性值,它必须放在要计算的表达式的 LHS 上。 以下表达式将成功:
Filter(
Budgets,
'Business unit ID'.Name = LookUp(
Users,
'Primary Email' = User().Email,
'Business Unit'
).Name,
DataCardValue37.Selected.'Date Range String'='Date Range String'
)
但是,此表达式不会成功:
Filter(
Budgets,
LookUp(
Users,
'Primary Email' = User().Email,
'Business Unit'
).Name = 'Business unit ID'.Name,
'Date Range String'=DataCardValue37.Selected.'Date Range String'
)
排序函数
Sort 和 SortByColumns 可以委派。
在 Sort 中,公式只能是单个列的名称,不能包括其他运算符或函数。
聚合函数
某些聚合函数可以基于后端支持进行委派。 可以委派 Sum、Average、Min 和 Max 等函数。 也可以委派计数函数,如 CountRows 和 Count。 但是 RemoveIf 和 UpdateIf 具有委派限制。 当前,仅有限数量的数据源支持这些函数的委派。 有关更多详细信息,请参阅委派列表。
不可委派函数
所有其他函数都不支持委派,包括以下重要函数:
不可委派限制
将在本地处理不可委派的公式。 本地处理允许使用整套 Power Apps 公式语言。 但是也有代价:所有数据都必须先转到设备上,这可能需要通过网络检索大量的数据。 这可能需要一段时间,让人以为应用很慢或者可能已崩溃。
为了避免这种情况,Power Apps 对能够在本地处理的数据量进行了限制:默认情况下为 500 条记录。 我们选择此数字是为了让您仍然能够对小型数据集进行完整的访问,同时让您虽然只能看到部分结果,也能练习对大型数据集的使用。
显然,使用此工具时必须小心,因为这可能会让用户感到困惑。 例如,假设有一个 Filter 函数,其选择公式不能委派,需要对有一百万条记录的数据源应用该函数。 由于本地进行筛选,因此仅扫描了前 500 条记录。 如果所需记录是第 501 或第 500,001 个记录,则 Filter 不会考虑或返回该记录。
聚合函数还可能会造成混淆。 对上述包含百万记录的数据源的一个列运行 Average 函数。 在这种情况下,无法委派平均值,因为未委派表达式(参见前面的说明),所以只能取前 500 条记录的平均值。 如果不小心,可能会将应用用户基于部分数据得出的答案误认为是基于完整数据得出的答案。
更改限制
500 是默认的记录数,但可为整个应用更改此数字:
- 选择设置。
- 在常规下,将数据行限制设置从 1 更改为 2000。
在某些情况下,您会发现 2,000(或者 1,000 或 1,500)即可满足您的场景需求。 可以谨慎增大此数字以适应您的方案。 增大此数字,应用的性能可能会降低,特别是对于具有大量列的宽表。 尽管如此,仍是委派越多越好。
若要确保应用可以扩展为大型数据集,请将此设置降低为 1。 现在,任何无法委派的内容将会返回一条记录,在测试应用时应该很容易被检测到。 这有助于在尝试将概念证明应用用于生产时防止意外发生。
委派警告
为使您更轻松了解可委派和不可委派的内容,Power Apps 会在您创建包含不可委派内容的公式时提供警告(黄色三角形)。
委派警告仅显示在针对可委派数据源进行运算的公式上。 如果没有看到警告,但您认为公式未进行适当的委派,请对照本文前面部分的可委派数据源列表检查数据源的类型。
示例
对于此示例,将基于名为 [dbo].[Fruit] 的 SQL Server 表自动生成一个三屏应用。 有关如何生成应用的信息,可将Dataverse 相关文章中的类似准则应用到 SQL Server。
库的 Items 属性设置为包含 SortByColumns 和 Search 函数的公式,这两个函数都可以委派。
在搜索框中,键入“Apple”。
当应用与 SQL Server 进行通信来处理搜索请求时,一串移动的点会短暂出现在屏幕顶部附近。 将显示符合搜索条件的所有记录,即使数据源包含数百万条记录。
搜索结果包括“Apples”和“Pineapple”,因为 Search 函数会查找文本列中的所有位置。 如果只想查找在水果名称的开头包含搜索词的记录,可以使用另一个可委派函数 Filter,并添加更复杂的搜索词。 (为简单起见,请删除 SortByColumns 调用。)
新的结果包括“Apples”,而不包括“Pineapple”。 但是,一个黄色的三角形将出现在图库旁边(如果左侧导航栏显示了缩略图,它还会出现在屏幕缩略图中),并且公式的一部分下方出现蓝色波浪线。 其中每个元素都表示一条警告。 如果将光标悬停在图库旁边的黄色三角形上,将显示此消息:
SQL Server 是可委派数据源,Filter 是可委派函数,但不能将 Mid 并 Len 委派到任何数据源。
但它确起作用了,不是吗? 嗯,在某种程度上可以这么说。 因此显示了这个警告,而不是红色波浪线。
- 如果表包含 500 条以下的记录,该公式运算将会非常顺利。 所有记录都会转到设备,并在本地应用 Filter。
- 如果表包含超过 500 条记录,该公式不会返回第 501 条或以后的记录,即使它与条件匹配。