次の方法で共有


クエリの制限: 委任とクエリの制限

委任を理解する

Power Apps Power Fx クエリを データ ソース で実行できる同等のクエリに完全に変換できる場合、バックエンド データ ソース で最もよく機能します。 Power Apps データ ソース が理解できるクエリを送信し、クエリは データ ソース で実行され、クエリ結果が Power Apps に返されます。 たとえば、データ ソース は、データ ソース 上のデータをフィルタリングする作業を実行し、フィルタ基準を満たす行のみを返す場合があります。 これが正しく機能する場合、クエリの作業を実行するためにクエリが データ ソース に 委任 されたと言います。

ただし、Power Fx クエリは、すべてのデータ ソース上の同等のクエリに常に変換できるわけではありません。 たとえば、Dataverse は Excel よりも多くのクエリ機能をサポートしています。 Dataverse は 'in' (メンバーシップ) クエリ演算子をサポートしますが、Excel はサポートしません。 データ ソース がサポートしていない機能をクエリが使用している場合、そのクエリは 委任不可能 であると言えます。 一般に、クエリ式の一部が委任できない場合、クエリのどの部分も委任しません。

クエリが委任不可能な場合、Power Apps は データ ソース から最初の 500 レコードのみを取得し、クエリ内のアクションを実行します。 この制限は 2,000 レコードまで増やすことができます。制限を変更するとPower Apps は、Power Apps の良好なパフォーマンスを維持するために結果のサイズが 500 レコードに制限されます。 実験により、結果セットがこれらのサイズを超えると、アプリや Power Apps 全般にパフォーマンスの問題が発生することが判明しました。

ただし、データ ソース のデータが 500/2000 レコードを超える場合、クエリが誤った結果を返す可能性があるため、この制限が問題になる可能性があります。 たとえば、データ ソース に 1,000 万件のレコードがあり、クエリがデータの最後の部分を操作する必要がある例を考えてみましょう。 (たとえば、'Z' で始まる姓) ただし、クエリに委任不可能な演算子 (たとえば、distinct) が含まれています。この場合、最初の 500/2000 レコードのみが取得され、正しい結果がでません。

データ ソースの委任可能なテーブルを使用して Power Fx クエリを実行します。 委任できるクエリ関数のみを使用してください。 それがアプリのパフォーマンスを高く維持し、ユーザーが必要なすべての情報にアクセスできるようにする唯一の方法です。

委任を使用できないことを示す警告が出た場合は注意してください。 小規模なデータ セット (500 件未満のレコード) を操作する場合は、式を委任できなくてもアプリはデータをローカルに処理できるため、任意のデータ ソースと式を使用できます。

注意

委任の警告は、正しい結果が得られるようにアプリを管理するのに役立ちます。 データ ソース 内のデータが 500 レコードを超えており、関数を委任できない場合は、Power Fx 式に青い下線が付きます。

データ ソースの委任

委任は、特定の表形式のデータ ソースでのみサポートされています。 データ ソースが委任をサポートしている場合、コネクタのドキュメントがそのサポートの概要を説明しています。 たとえば、次の表形式のデータソースは特に好評で、委任をサポートしています。

インポートされた Excel ブック (静的データをアプリに追加しますのデータ ソースを使用)、コレクション、およびコンテキスト変数に格納されたテーブルには、委任は不要です。 これらのデータはすべてメモリ内に既にあり、Power Apps 言語をすべて適用できます。

委任可能な関数

次のステップでは、委任できる数式のみを使用します。 ここに含まれるのは、委任できる数式の要素です。 ただし、データ ソースはすべて異なっており、すべてのデータ ソースでこれらの要素がすべてサポートされているわけではありません。 特定の式で委任の警告を確認します。

Filter 関数

FilterSearchFirstLookUp は委任できます。

Filter 関数と LookUp 関数内では、テーブルの列でこれらを使用して、適切なレコードを選択できます。

  • And (&&を含む)、Or (||を含む)、Not (!を含む)
  • In

    注意

    In は、ベースデータソースの列に対してのみ委任されます。 たとえば、データソースが Accounts テーブルの場合、Filter(Accounts, Name in ["name1", "name2"]) はデータソースに評価を委任します。 しかし、Fullname 列が Accounts とは別のテーブル ( PrimaryContact ) にあるため、Filter(Accounts, PrimaryContact.Fullname in ["name1", "name2"]) は委任されません。 式はローカルで評価されます。

  • =<>>=<=><
  • +-
  • TrimEnds
  • IsBlank
  • StartsWithEndsWith
  • コントロール プロパティやグローバルおよびコンテキスト変数のように、すべてのレコードで定数値となるものです。

また、すべてのレコードで 1 つの定数値に評価される式の一部を使用することもできます。 たとえば、Left( Language(), 2 )Date( 2019, 3, 31 )、および Today() は、レコードのどの列にも依存していないため、すべてのレコードに対して同じ値を返します。 これらの値は定数としてデータ ソースに送信でき、委任をブロックしません。

上のリストには、これらの重要な項目は含まれていません。

既知の制限

ルックアップレベル

Power Apps は 2 つのルックアップ レベルをサポートします。 これは、Power Fx クエリ式には、最大で 2 つの検索関数を含めることができます。 この制限はパフォーマンスを保持するためです。 クエリ式にルックアップが含まれる場合、Power Apps は最初にクエリを実行してベーステーブルを取得します。 次に、最初のテーブルをルックアップ情報で展開する 2 番目のクエリを実行します。 それを超えるもう 1 つのレベルを最大としてサポートします。 ただし、オフラインの場合は、1 レベルのルックアップ展開のみがサポートされます。

数式の評価 - エンティティのプロパティは、等値演算子の左側にある "LHS" である必要があります

式で比較するエンティティのプロパティを方程式の左側にある "LHS" に配置することが重要です。 説明するために、エンティティ プロパティの下にある例 "部署 ID"名前 はプロパティ値であり、評価される式の 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'
    )

並べ替え関数

SortSortByColumns は委任できます。

Sort の数式には、1 つの列の名前のみを指定できます。他の演算子や関数を含めることはできません。

Aggregate 関数

特定の集計関数は、バックエンドのサポートに基づいて委任できます。 SumAverageMin、および Max などの関数は委任できます。 CountRowsCount などのカウント関数は委任できません。 ただし、 RemoveIfUpdateIf には委任制限があります。 現在、これらの機能の委任をサポートしているデータ ソースは限られています。 詳細については、委任リストを参照してください。

非委任関数

これら主な関数を含むその他すべての関数では、委任がサポートされません。

非委任制限

委任できない数式は、ローカルで処理されます。 ローカル処理は、Power Apps の数式言語をすべて使用できます。 ただし、欠点があります。最初にすべてのデータをデバイスに取り込む必要があるため、ネットワーク経由で大量のデータを取得する可能性があります。 その処理には時間がかかり、アプリの動作が遅いとか、クラッシュしているかもしれないという印象を与える可能性があります。

この問題を回避するために、Power Apps では、ローカルで処理可能なデータの量を既定で 500 件のレコードに制限しています。 この数字を選択したのは、小規模なデータ セットには変わらず完全にアクセスでき、大規模なデータ セットでは部分的な結果を確認して使い方を改善できるためです。

この機能は、ユーザーの混乱を招く可能性があるため、使用する際は当然注意が必要です。 たとえば、100 万件のレコードを含むデータ ソースに対する、委任できない選択数式の Filter 関数があるとします。 フィルター処理はローカルに行われるため、最初の 500 レコードのみがスキャンされます。 目的のレコードがレコード 501 や 500,001 の場合、Filter では考慮されず、返されません。

集計関数も混乱を招く可能性があります。 100 万件のレコードがある同じデータ ソースの 1 つの列の平均を計算します。 この場合、式が委任されていないため、平均 を委任することはできません (以前のメモ 参照)。最初の 500 レコードのみが平均化されます。 注意しないと、アプリのユーザーが部分的な回答を完全な回答と誤解する可能性があります。

制限の変更

500 が既定のレコード数ですが、アプリ全体についてこの値を変更することができます。

  1. 設定を選択します。
  2. 全般の下で、データ行の制限設定を 1 から 2000 まで変更します。

場合によっては、2,000 (または 1,000 や 1,500) の方がシナリオのニーズに適していることがあるでしょう。 シナリオに合わせて、この数を慎重に増やしてください。 この数を増やすと、特に列の数が多く幅が広いテーブルで、アプリのパフォーマンスが低下する場合があります。 それでも、できる限り委任するのが最適です。

アプリが大規模なデータ セットに合わせて拡張できるようにするには、この設定を 1 まで減らしてください。 委任できないものはすべて、アプリのテストのタイミングが見つけやすくなるように、単一のレコードを返します。 これにより、概念実証アプリを運用するときに予想外の事態が発生することを回避できます。

委任の警告

委任されるものとされないものを見分けやすいように、Power Apps では、委任できないものを含む式を作成すると、警告 (黄色の三角形) が表示されます。

委任の警告は、委任可能なデータ ソースを操作する式にのみ表示されます。 警告が表示されないものの、式が適切に委任されていないと思われる場合は、この記事の前に示した委任可能なデータ ソースの一覧で、データ ソースの種類を確認してください。

使用例

この例では、[dbo].[Fruit] という名前の SQL Server テーブルを基にして、3 画面のアプリを自動的に生成します。 アプリの生成方法に関する情報については、SQL Server に対する Dataverse に関する記事 と類似する原則を適用できます。

3 画面アプリ。

ギャラリーの Items プロパティは、SortByColumns 関数と Search 関数を含む式に設定されています。どちらの関数も委任できます。

検索ボックスに Apple と入力します。

アプリが SQL Server と通信して検索を処理する間、画面の上部近くに動くドットが一瞬表示されます。 データ ソースに何百万ものレコードが含まれる場合でも、検索条件を満たすすべてのレコードが表示されます。

text-input コントロールを検索する。

Search 関数はテキスト列のすべての場所を探すので、検索結果には "Apples""Pineapple" が含まれます。 果物の名前の先頭に検索語を含むレコードのみを検索する場合は、別の委任可能な関数 フィルタ― でさらに複雑な検索語を使用できます。 (簡単にするため、SortByColumns の呼び出しは削除します。)

SortByColumns 呼び出しを削除する。

新しい結果には、"Apples" は含まれますが、"Pineapple" は含まれません。 ただし、ギャラリーの横 (および、左側のナビゲーション バーにサムネイルが表示されている場合は画面のサムネイル) に黄色の三角形が表示され、式の一部分の下に青い波線が表示されます。 これらの各要素は警告を示します。 ギャラリーの横の黄色い三角形をポイントすると、次のメッセージが表示されます。

委任の警告をポイントする。

SQL Server は委任可能なデータ ソースであり、Filter は委任可能な関数ですが、MidLen はどのデータ ソースにも委任できません。

それでも、うまくいきましたよね。 まあ、そうですね。 これが警告であり、赤い波線ではない理由です。

  • テーブルのレコードが 500 未満の場合、式は問題なく機能しました。 すべてのレコードがデバイスに取り込まれ、Filter がローカルで適用されました。
  • テーブルのレコードが 500 を超えると、条件に一致していても、式は 501 番目以降のレコードを返しません。

関連項目

委任できない関数の使用と、パフォーマンス上の不適切なデータ行の制限に対する影響
パフォーマンスに関するヒントと委任を使うベスト プラクティス