Поділитися через


Обмеження запитів: обмеження делегування та запитів

Розуміння делегування

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

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

Якщо запит не підлягає делегації,отримує з джерело даних лише перші 500 записів, а потім виконує дії, Power Apps описані в запиті. Цей ліміт можна збільшити до 2 000 записів Зміна ліміту обмежує розмір результату до 500 записів Power Apps , щоб зберегти хорошу Power Apps продуктивність. Під час експериментів ми з’ясували, що набори результатів, більші за ці розміри, створюють проблеми з продуктивністю вашого додатка та Power Apps загалом.

Однак це обмеження може бути проблемою, оскільки запит може видавати неправильні результати, якщо дані в джерело даних перевищують 500/2000 записів. Наприклад, розглянемо приклад, коли ваш джерело даних містить 10 мільйонів записів, а запит має оперувати з останньою частиною даних. (Наприклад, прізвища, які починаються на «Z») Однак у запиті є оператор, який не підлягає делегуванню (наприклад, distinct). У цьому випадку ви отримуєте лише перші записи 500/2000 і маєте неправильні результати.

Створюйте свої Power Fx запити, використовуючи розкладні таблиці для вашого джерело даних. Слід використовувати лише функції запитів, які можна делегувати. Це єдиний спосіб забезпечити належну роботу вашого додатка та забезпечити користувачам доступ до всієї необхідної інформації.

Звертайте увагу на попередження про делегування, які вказують на місця, де делегування неможливо. Якщо ви працюєте з невеликими наборами даних (менше 500 записів), ви можете використовувати будь-які джерело даних і формули, оскільки програма може обробляти дані локально, якщо формулу не можна делегувати.

Примітка

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

Делегування джерел даних

Делегування підтримується тільки для певних табличних джерел даних. Якщо джерело даних підтримує делегування, в його документації по з'єднувачах описується така підтримка. Наприклад, ці табличні джерела даних є найбільш популярними і підтримують делегування:

Для імпортованих книг Excel (за допомогою додавання статичних даних в джерело даних програми), колекцій і таблиць, що зберігаються в змінних контексту, делегування не потрібно. Усі ці дані вже є в пам'яті, і можна застосовувати повноцінну мову Power Apps.

Функції, які можна делегувати

Наступний етап полягає в використанні тільки тих формул, які можна делегувати. Тут вказані елементи формул, що підтримують делегування. Проте слід пам'ятати, що джерела даних розрізняються, і не всі вони підтримують наведені тут елементи. Перевірте наявність попереджень про делегування у використовуваній формулі.

Функції фільтрування

Фільтр, Пошук, ... Перший і LookUp можна делегувати.

У функціях Filter і LookUp для вибору відповідних записів у стовпчиках таблиці можна використовувати наступні оператори і функції:

  • And (у тому числі &&), Or (у тому числі ||), Not (у тому числі !)
  • В

    Примітка

    In делегується тільки для стовпців на основі джерела даних. Наприклад, якщо джерело даних – таблиця Бізнес-партнери, то Filter(Accounts, Name in ["name1", "name2"]) делегується до джерела даних для оцінки. Однак, Filter(Accounts, PrimaryContact.Fullname in ["name1", "name2"]) не делегується, оскільки стовпець Повне ім’я розташовано в іншій таблиці (Основний контакт), а не в Бізнес-партнери. Вираз оцінюється локально.

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

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

Попередній список не містить наступні важливі елементи:

Обмеження запитів

Рівні підстановки

Power Apps Підтримує два рівні підстановки. Це означає, що Power Fx вираз запиту може мати — щонайбільше — дві функції підстановки. Це обмеження призначене для збереження продуктивності. Якщо вираз запиту містить підстановку, спочатку виконується запит, Power Apps щоб отримати базову таблицю. Потім виконується другий запит, який розгортає першу таблицю з інформацією про підстановку. Ми підтримуємо ще один рівень поза цим як максимум. Однак для автономного режиму ми підтримуємо лише один рівень розширення пошуку.

Оцінка виразу - властивість сутності повинна знаходитися в лівій частині ’LHS’ оператора рівності

Важливо помістити властивість об’єкта, що порівнюється у виразі, у лівій частині «LHS» рівняння. Наприклад, у наведеному нижче прикладі властивість сутності "Ідентифікатор одиниці бізнесу". 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. Виберіть Настройки.
  2. В області Загальне, змініть параметр Граничне значення рядка даних від 1 до 2000.

У деяких випадках ви знаєте, що 2 000 (або 1 000, або 1 500) задовольнять потреби вашого сценарію. Це число можна обережно збільшувати відповідно до потреб сценарію. Збільшення цього параметра може призвести до зниження продуктивності програми, особливо для таблиць з великою кількістю стовпців. Але найкращий варіант - делегувати всі, що тільки можна делегувати.

Щоб ваш додаток міг масштабуватися до великих наборів даних, зменшіть це налаштування до 1. Тепер все, що не може бути делеговане, поверне один запис. Це легко виявити при тестуванні програми. Це допоможе уникнути сюрпризів при перевірці програми в робочому середовищі.

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

Щоб полегшити знання того, що є або не є делегованим, Power Apps надає попередження (жовтий трикутник) при створенні формули, яка містить щось, що не може бути делеговане.

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

Приклади

Наприклад, ви автоматично створюєте програму з трьома екранами на основі таблиці SQL Server з ім'ям [dbo].[Fruit]. Для отримання інформації про те, як створити програму, ви можете застосувати аналогічні принципи в статті про Dataverse SQL Server.

Програма з трьох екранів.

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

В полі пошуку введіть «Apple».

У верхній частині екрану відразу з'являться точки, так як програма взаємодіє з SQL Server для обробки пошукового запиту. Відобразяться всі записи, що відповідають критеріям пошуку, навіть якщо джерело даних містить мільйони записів.

Елемент керування пошуком «Ввід тексту».

Результати пошуку включають "Яблука" і "Ананаси", тому що функція Пошук шукає в цілому текстовому стовпці. Якщо потрібно знайти тільки записи, які містять умову пошуку на початку назви фрукту, можна скористатися іншою функцією, що делегується, Filter (Фільтрувати), із складнішою умовою пошуку. (Для простоти, вилучіть виклик SortByColumns.)

Вилучення виклику SortByColumns.

Нові результати включають Яблука, але не Ананаси. Поруч з колекцією (і в ескізі екрану, якщо в лівій панелі переходів відображаються ескізи) відображається жовтий трикутник, і частина формули підкреслюється синьою хвилястою лінією. Кожен з цих елементів вказує на попередження. Якщо навести курсор на жовтий трикутник поруч з колекцією, ви побачите наступне повідомлення:

Наведення курсора на попередження про делегацію.

SQL Server є делеговані джерелом даних, а Filter є делеговані функцією, проте Mid і Len неможливо делегувати жодному джерелу даних.

Але ж ми отримали потрібні результати? У певному сенсі - так. Тому це попередження, а не червона хвиляста лінія.

  • Якщо таблиця містить не більше 500 записів, формула дала правильний результат. Всі ці записи були завантажені на пристрій, і функцію Filter застосовано локально.
  • Якщо таблиця містить більше 500 записів, формула не повертає запис 501 і далі, навіть якщо вона відповідає критеріям.

Статті за темою

Вплив використання функцій, які не передаються, й неприйнятних лімітів рядків даних для запитів на швидкодію
Поради й рекомендації щодо використання делегування та продуктивності

Примітка

Розкажіть нам про свої уподобання щодо мови документації? Візьміть участь в короткому опитуванні. (зверніть увагу, що це опитування англійською мовою)

Проходження опитування займе близько семи хвилин. Персональні дані не збиратимуться (декларація про конфіденційність).