Ограничения запросов: делегирование и лимиты на запросы

О делегировании

Power Apps лучше всего работает с тыловым источником данных, когда запрос Power Fx может быть полностью преобразован в эквивалентный запрос, который можно запустить в источнике данных. Power Apps отправляет запрос, который источник данных понимает, запрос выполняется в источнике данных, и результаты запроса возвращаются в Power Apps. Например, источник данных может выполнять работу по фильтрованию данных в источнике данных и возвращать только те строки, которые соответствуют критериям фильтра. Когда это работает правильно, мы говорим, что запрос делегируется источнику данных для выполнения предусмотренной запросом работы.

Однако Power Fx запросы не всегда можно преобразовать в эквивалентные запросы для всех источников данных. Например, Dataverse поддерживает больше функций запросов, чем Excel. Dataverse поддерживает оператор запроса «in» (членство), а Excel — нет. Мы говорим, что запрос не подлежит делегированию, если в запросе используется функция, которую источник данных не поддерживает. В общем случае, если какая-либо часть выражения запроса не подлежит делегированию, мы не делегируем никакую часть запроса.

Если запрос не подлежит делегированию, Power Apps получает только первые 500 записей из источника данных, а затем выполняет действия в запросе. Этот лимит может быть увеличен до 2000 записей. Изменение лимита Power Apps ограничивает размер результата 500 записями, чтобы поддерживать достаточно высокую производительность Power Apps. В ходе экспериментов мы обнаружили, что наборы результатов, превышающие эти размеры, приводят к проблемам с производительностью приложения и Power Apps в целом.

Однако это ограничение может стать проблемой, поскольку запрос может вернуть неправильные результаты, если объем данных в источнике данных превышает 500/2000 записей. Например, рассмотрим пример, где в источнике данных содержится 10 миллионов записей, и запрос должен обрабатывать последнюю часть данных. (Например, фамилии, начинающиеся с буквы Z). Однако в вашем запросе есть неделегируемый оператор (например, distinct). В этом случае вы получите только первые 500/2000 записей, и результаты будут неправильными.

Создавайте запросы Power Fx, используя делегируемые таблицы для своего источника данных. Следует использовать только те функции запроса, которые можно делегировать. Только так можно сохранить работоспособность приложения на высоком уровне и обеспечить пользователям доступ ко всей необходимой им информации.

Обращайте внимание на предупреждения о делегировании, которые указывают на места, где делегирование невозможно. Если вы работаете с небольшими наборами данных (до 500 записей), можно использовать любые источники данных и формулы, так как приложение может обрабатывать данные локально даже в случае, если формулу нельзя делегировать.

Примечание

Предупреждения о делегировании помогают управлять приложением и получать правильные результаты. Если объем данных в вашем источник данных превышает 500 записей и функцию нельзя делегировать, Power Fx помечает формулу синим подчеркиванием.

Делегирование источников данных

Делегирование поддерживается только для определенных табличных источников данных. Если источник данных поддерживает делегирование, его документация по соединителю описывает эту поддержку. Например, эти табличные источники данных являются наиболее популярными и поддерживают делегирование:

Импортированные книги Excel (для которых используется источник Добавить статические данные для приложения), коллекции и таблицы, хранимые в переменных контекста, не требуют делегирования. Все эти данные уже находятся в памяти и поддерживают все функциональные возможности языка Power Apps.

Делегируемые функции

Следующий этап заключается в использовании только тех формул, которые можно делегировать. Здесь указаны элементы формул, поддерживающие делегирование. Тем не менее следует помнить, что источники данных различаются, и не все они поддерживают приведенные здесь элементы. Проверьте наличие предупреждений о делегировании в формуле.

Функции фильтрации

Функции Filter, Search, First и LookUp можно делегировать.

В функциях Filter и LookUp для выбора соответствующих записей в столбцах таблицы можно использовать следующие операторы и функции:

  • And (включая &&), Or (включая ||), Not (включая !)
  • In

    Примечание

    In делегируется только для столбцов в базовом источнике данных. Например, если источник данных является таблицей Учетные записи, то Filter(Accounts, Name in ["name1", "name2"]) делегирует на источник данных для оценки. Однако, Filter(Accounts, PrimaryContact.Fullname in ["name1", "name2"]) не делегирует, так как столбец Fullname находится в другой таблице (PrimaryContact), отличной от Учетные записи. Выражение оценивается локально.

  • =, <>, >=, <=, >, <
  • +, -
  • TrimEnds
  • IsBlank
  • StartsWith, EndsWith
  • Постоянные значения, одинаковые для всех записей, такие как свойства элемента управления и глобальные и контекстные переменные.

Также можно использовать части формул, которые возвращают константные значения для всех записей. Например, результат выполнения формул Left( Language(), 2 ), Date( 2019, 3, 31 ) и Today() не зависит от содержимого столбцов записи и возвращает одинаковое значение для всех записей. Эти значения могут быть отправлены в источник данных как константа и не будут блокировать делегирование.

Предыдущий список не содержит следующие важные элементы:

Ограничения запросов

Уровни подстановки

В Power Apps поддерживается два уровня подстановки. Это означает, что выражение запроса Power Fx может содержать не более двух функций подстановки. Это ограничение предусмотрено для сохранения производительности. Если выражение запроса включает подстановку, Power Apps сначала выполняет запрос для получения базовой таблицы. Затем выполняется второй запрос, который расширяет первую таблицу подстановочной информацией. Мы поддерживаем еще один уровень сверх этого как максимум. В автономном режиме, однако, мы поддерживаем только один уровень расширений с использованием подстановки.

Определение значения выражения: свойство сущности должно находиться слева от оператора равенства

Очень важно, чтобы сравниваемое в выражении свойство сущности находилось в левой части уравнения. Для иллюстрации в примере ниже свойство сущности 'Business unit ID'.Name — это значение свойства, и оно должно находиться в левой части вычисляемого выражения. Следующее выражение будет работать:

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, примененную к тому же самому источнику данных с миллионом записей. Average не может быть делегировано в этом случае, поскольку выражение не делегировано (см. ранее примечание), поэтому усредняются только первые 500 записей. Этот фактор необходимо учитывать: в противном случае пользователь приложения ошибочно посчитает полным результат обработки лишь части набора.

Изменение ограничения

По умолчанию количество записей равно 500, но можно изменить это число для всего приложения:

  1. Выберите Параметры.
  2. В Общее измените параметр Предельное число строк с 1 на 2000.

В некоторых случаях вам может быть известно, что оптимальным значением для вашего сценария является 2000 (или 1000, или 1500). Это число можно осторожно увеличивать в соответствии с потребностями сценария. Увеличение этого параметра может привести к снижению производительности приложения, особенно для таблиц с большим количеством столбцов. Но лучший вариант — делегировать все, что только можно делегировать.

Чтобы убедиться, что ваше приложение может масштабироваться для больших наборов данных, уменьшите значение этого параметра до 1. Теперь все, что не может быть делегировано, возвратит одну запись. Это легко обнаружить при тестировании приложения. Это поможет избежать сюрпризов при проверке приложения в рабочей среде.

Предупреждения о делегировании

Чтобы вы всегда знали, что можно, а что нельзя делегировать, Power Apps предоставляет предупреждение (желтый треугольник) при создании формулы с неделегируемыми элементами.

Предупреждения о делегировании отображаются только для формул, которые работают с делегируемыми источниками данных. Если вы не видите подобного предупреждения и считаете, что формула не делегируется надлежащим образом, проверьте, есть ли ваш источник в списке делегируемых источников данных выше в этой статье.

Примеры

Например, вы автоматически создаете приложение с тремя экранами на основе таблицы SQL Server с именем [dbo].[Fruit]. О том, как создать такое приложение, см. в статье о Dataverse; аналогичные принципы применимы к SQL Server.

Приложение с тремя экранами.

Для свойства Items коллекции установлена формула, которая содержит функции SortByColumns и Search. Обе функции можно делегировать.

В поле поиска введите Apple.

В верхней части экрана сразу появятся точки, так как приложение взаимодействует с SQL Server для обработки поискового запроса. Отобразятся все записи, соответствующие критериям поиска, даже если источник данных содержит миллионы записей.

Элемент управления Search text-input.

Результаты поиска включают "Apples" и "Pineapple", поскольку функция Search ищет по всему текстовому столбцу. Если вы хотите найти только те записи, которые содержат поисковой запрос в начале названия фрукта, используйте другую делегируемую функцию Filter для более сложных критериев поиска. (Для простоты удалите вызов SortByColumns.)

Удаление вызова SortByColumns.

Новые результаты включают "Apples", но не "Pineapple". Однако рядом с коллекцией (и в эскизе экрана, если в левой панели навигации отображаются эскизы) отображается желтый треугольник, и часть формулы подчеркивается синей волнистой линией. Каждый из этих элементов указывает на предупреждение. Если навести курсор на желтый треугольник рядом с коллекцией, вы увидите следующее сообщение:

Наведение указателя мыши на предупреждение о делегировании.

SQL Server является делегируемым источником данных, а Filter является делегируемой функцией, однако Mid и Len невозможно делегировать источнику данных.

Но мы ведь получили нужные результаты? В некотором смысле — да. Поэтому это предупреждение, а не красная волнистая линия.

  • Если таблица содержит не более 500 записей, формула дала правильный результат. Все эти записи были загружены на устройство, и функция Filter была применена локально.
  • Если таблица содержит более 500 записей, формула не возвращает запись 501 и далее, даже если она соответствует критериям.

См. также

Влияние использования неделегируемых функций и недопустимых лимитов строк данных на производительность
Советы по производительности и лучшие методики использования делегирования

Примечание

Каковы ваши предпочтения в отношении языка документации? Пройдите краткий опрос (обратите внимание, что этот опрос представлен на английском языке).

Опрос займет около семи минут. Личные данные не собираются (заявление о конфиденциальности).