次の方法で共有


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

Power Apps は、Power Fx クエリがデータ ソース上で実行される同等のクエリに完全に変換できる場合に、バックエンドのデータ ソースと組み合わせて使用すると最も効果的です。 Power Apps がデータ ソースが理解できるクエリを送信すると、データ ソースはクエリを実行し、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 は、ベースデータソースの列に対してのみ委任されます。 たとえば、データソースが 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() は、レコードのどの列にも依存していないため、すべてのレコードに対して同じ値を返します。 これらの値は定数としてデータ ソースに送信でき、委任をブロックしません。

前の一覧には、次の重要な項目は含まれていません。

委任とコレクション

WithUpdateContext、またはSetを使用する場合、これらの関数は内部的にコレクションを作成します。 コレクションは、レコードの静的なメモリ内リストであり、委任に参加できません。 委任の警告は表示されません。

既知の制限

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

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

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

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

比較するエンティティのプロパティを方程式の左辺 (LHS) に配置します。 たとえば、次の式では、エンティティ プロパティ 'Business unit 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 万件のレコードを含むデータソースに対して委任できない選択式でフィルター関数を使用すると、最初の 500 件のレコードのみがスキャンされます。 目的のレコードがレコード 501 または 500,001 の場合、 フィルター はそれを見つけたり返したりしません。

集計関数も混乱を招く可能性があります。 たとえば、同じ 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 番目以降のレコードを返しません。

参照