查詢限制:委派和查詢限制
了解委派
當 Power Fx 查詢可以完全轉換為可在資料來源上執行的等效查詢時,Power Apps 與後端資料來源搭配使用的效果最佳。 Power Apps 發送資料來源理解的查詢,查詢會在資料來源上執行,並將查詢結果傳回 Power Apps。 例如,資料來源可能會執行篩選資料來源上資料的工作,且只傳回滿足篩選條件的列。 當這正常運作時,我們會說查詢被委派給資料來源來完成查詢的工作。
不過,Power Fx 查詢不一定能在所有資料來源上轉換為等效查詢。 例如,Dataverse 比 Excel 支援更多查詢功能。 Dataverse 支援 'in' (membership) 查詢運算子,但 Excel 不支援。 如果查詢使用資料來源不支援的功能,我們會說查詢是不可委派的。 一般來說,如果查詢運算式有任何部分是不可委派的,我們就不會委派查詢的任何部分。
當查詢不可委派時, Power Apps 僅能從資料來源中取得前 500 筆記錄,然後執行查詢中的動作。 此限制可增加至 2,000 筆記錄 更改限制 Power Apps 將結果大小限制為 500 筆記錄,以保持 Power Apps 的良好效能。 我們透過實驗發現,大於這些大小的結果集通常會為您的應用程式和 Power Apps 帶來效能問題。
但是,此限制可能是一個問題,因為如果資料來源上的資料超過 500/2000 筆記錄,則查詢可能會傳回不正確的結果。 例如,考慮以下範例:您的資料來源有 1000 萬筆記錄,且您的查詢需要在資料的最後一部分進行作業。 (例如,以「Z」開頭的姓氏) 但是,您的查詢中有一個不可委派的運算子 (例如,非重複)。在這種情況下,您只能取得前 500/2000 筆記錄,且會得到不正確的結果。
使用資料來源的可委派表格建立您的 Power Fx 查詢。 您應該僅使用可委派的查詢函數。 這是讓您的應用程式正常執行,並確保使用者可以存取全部所需資訊的唯一方法。
請注意可識別無法委派之位置的委派警告。 如果您要處理小型資料集 (少於 500 筆記錄),則可以使用任何資料來源和公式,因為如果公式無法委派,應用程式可以在本機處理資料。
注意
委派警告可協助您管理應用程式,以具有正確的結果。 如果資料來源中的資料超過 500 筆記錄,且函數無法委派, 則 Power Fx 則會用藍色下劃線標記公式。
可委派的資料來源
僅有部分表格式資料來源可支援委派。 如果資料來源支援委派,則其 連接器文件 會概述支援。 例如,這些表格資料來源是最常用的,而且它們支援委派:
- Microsoft Dataverse 的 Power Apps 可委派函數和作業
- SharePoint 的 Power Apps 可委派函數和作業
- SQL Server 的 Power Apps 可委派函數和作業
- Salesforce 的 Power Apps 可委派函數和作業
儲存在內容變數中的已匯入 Excel 活頁簿 (使用 Add static data to your app 資料來源)、集合及表格不需要委派。 此資料已全部在記憶體中,且可套用完整的 Power Apps 語言。
可委派的函數
下一個步驟是僅使用可委派的公式。 以下提供可委派的公式元素。 不過,每個資料來源都不同,而且並非所有的資料來源都支援以下所有的公式元素。 檢查特定公式中的委派警告。
篩選函式
在 Filter 和 LookUp 函數內,您可以搭配使用下列項目與資料表的資料行,以選取適當的記錄:
- And(including**&&)、Or(including ||)、Not(including!**)
- In
注意
In 僅委派給基本資料來源中的資料行。 例如,如果資料來源是客戶資料表,則
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() 不依賴記錄的任何資料行,因此會為所有記錄傳回相同的值。 這些值可以當作常量傳送至資料來源,而不會封鎖委派。
前一份清單未包括這些值得注意的項目:
- 如果
- *,/,Mod
- 強制轉換欄作業**文字、值**
- Concatenate (including &)
- 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 筆以上的記錄,即使它符合準則也是一樣。