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


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

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

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

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

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

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

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

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

Нотатка

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

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

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

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

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

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

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

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

У функціях «Фільтр» і «Підстановка » можна використовувати їх зі стовпцями таблиці для вибору відповідних записів:

  • І (включаючи &&), Або (включаючи ||), Ні (в тому числі !)
  • В

    Нотатка

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

  • =, <>, >=, <=, >, <
  • +, -
  • Обрізки
  • ІсБланк
  • Починається з, закінчується з
  • Константні значення, однакові для всіх записів, таких як властивості елемента керування, глобальні та контекстні змінні.

Також можна використовувати частини формул, які повертають константні значення для всіх записів. Наприклад, 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 можна делегувати.

У режимі сортування формула може бути іменем лише одного стовпця та не може включати інші оператори або функції.

Агрегатні функції

Певні агрегатні функції можуть бути делеговані на основі підтримки серверної частини. Можна делегувати такі функції, як Sum, Average, Min і Max . Функції підрахунку, такі як CountRows і Count, також можуть бути делеговані. Однак RemoveIf і UpdateIf мають обмеження на делегування. Наразі лише обмежена кількість джерел даних підтримує делегування цих функцій. Для отримання більш детальної інформації зверніться до списку делегацій.

Функції, що не відступають

Всі інші функції не підтримують делегування. Нижче перераховані деякі з них.

Обмеження, що не підлягають делегуванню

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

Щоб уникнути цього, Power Apps накладає обмеження на обсяг даних, які можуть бути оброблені локально: 500 записів за замовчуванням. Ми вибрали саме це число, щоб забезпечити повний доступ до невеликих наборів даних і в той же час дати можливість оптимізувати обробку великих наборів на основі часткових результатів.

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

Агрегатні функції також можуть призвести до плутанини. Візьміть середнє значення над стовпцем того самого джерело даних із мільйоном записів. У цьому випадку середнє значення не може бути делеговане, оскільки вираз не делеговано (див. попередню примітку), тому усереднюються лише перші 500 записів. Цей фактор необхідно враховувати: в іншому випадку користувач програми помилково вважатиме повним результат обробки лише частини набору.

Змінення обмеження

За замовчуванням кількість записів дорівнює 500, але можна змінити це число для всієї програми:

  1. Виберіть Настройки.
  2. У розділі Загальні змінітьпараметр обмеження рядків даних з 1 на 2000 .

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

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

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

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

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

Приклади

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

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

Властивість галереї «Елементи » має значення формули, яка містить функції «Сортування за стовпцями» та «Пошук », обидві з яких можна делегувати.

У вікні пошуку введіть "Apple.

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

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

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

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

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

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

SQL Server — це делеговане джерело даних, а фільтр — це функція, яку можна виключити, однак Mid і Len не можуть бути делеговані жодному джерелу даних.

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

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

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

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