次の方法で共有


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

委任を理解する

Power Apps は、Power Fx クエリがデータソース上で実行される同等のクエリに完全に変換できる場合に、バックエンドのデータ ソースと組み合わせて使用すると最も効果的です。 Power Apps がデータソースが理解できるクエリを送信すると、データソースはクエリを実行し、Power Apps が結果を取得します。 たとえば、データ ソースはデータをフィルター処理し、フィルター 条件を満たす行のみを返します。 これが機能すると、クエリはデータソースに委任されます。

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

クエリが委任できない場合、Power Apps はデータ ソースから最初の 500 レコードを取得し、クエリのアクションを実行します。 この制限は 2,000 レコードまで増やすことができます。 制限を変更する Power Apps は、アプリのパフォーマンスを維持するために、結果のサイズを 500 件に制限します。結果セットが大きくなると、アプリと Power Apps のパフォーマンスに問題が生じる可能性があります。

ただし、データ ソースに 500 または 2,000 を超えるレコードがある場合、クエリが誤った結果を返す可能性があるため、この制限が問題になる可能性があります。 たとえば、データ ソースに 1,000 万レコードがあり、クエリでデータの最後の部分 ('Z' で始まる姓など) を処理する必要があり、クエリで distinct などの委任できない演算子が使用されている場合、最初の 500 レコードまたは 2,000 レコードしか取得されません。 これは、正しくない結果が得られることを意味します。

データ ソースの委任可能なテーブルを使用して 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"]) はデータソースに評価を委任します。 しかし、Filter(Accounts, PrimaryContact.Fullname in ["name1", "name2"])Full name列が Accounts とは別のテーブル (PrimaryContact) にあるため、委任されません。 式はローカルで評価されます。

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

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

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

委任とコレクション

WithUpdateContextSet を使用すると、内部的にコレクションが作成されます。 コレクションは、メモリ内のレコードの静的なリストであり、委任には関与しません。 委任の警告は表示されません。

既知の制限

ルックアップとレベルの展開

Power Apps では最大 2 つのルックアップ レベルを使用できます。 Power Fx のクエリ式には、パフォーマンスを維持するために最大 2 つの検索関数を含めることができます。 クエリ式にルックアップが含まれる場合、Power Apps は、まずベース テーブルに対してクエリを実行し、次に 2 番目のクエリを実行して、検索情報を含む最初のテーブルを展開します。 これを超える 1 つの追加レベルが最大値としてサポートされます。 ただし、オフライン シナリオでは、1 レベルのルックアップ展開のみがサポートされます。

1 つのクエリで最大 20 個のエンティティを展開または結合します。 1 つのクエリで 20 を超えるテーブルを結合する必要がある場合は、可能であればデータ サーバー上にビューを作成してみてください。

数式の評価 - エンティティのプロパティは、等値演算子の左側にある "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'
    )

並べ替え関数

SortSortByColumns は委任できます。

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

Aggregate 関数

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

委任できない関数

その他の関数は、以下の重要な関数を含み、委任できません。

委任できない場合の制限

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

この問題を回避するため、Power Apps ではローカルで処理可能なデータの量を既定で 500 件のレコードに制限しています。 この制限により、小さなデータセットを完全に使用し、部分的な結果を確認することで大きなデータセットの使用を絞り込むことができます。

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

集計関数も混乱を招く可能性があります。 たとえば、同じ 100 万件のレコードのデータ ソースの列に対して平均を使用する場合、式は委任されないため、平均は委任できません (前述の注を参照してください)。 最初の 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" が含まれます。 果物の名前の先頭に検索語を含むレコードのみを検索する場合は、別の委任可能な Filter 関数 でさらに複雑な検索語を使用できます。 簡素化する目的で、SortByColumns の呼び出しは削除します。

SortByColumns 呼び出しを削除する。

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

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

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

それでも、うまくいったはずです。 ある程度は。 そのため、これは警告であり、赤い波線ではありません。

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

参照