Zoptymalizowane wzorce danych zapytań

Najprostszy i najszybszy wzorzec zapytania o dane to:

  1. Pojedyncza tabela lub widok
  2. Wstępnie przefiltrowane na serwerze według potrzeb
  3. Kolumny są poprawnie indeksowane pod kątem oczekiwanych zapytań

Projektując aplikację, musisz pomyśleć o tym, jak szybko wysyłać zapytania do danych. Najlepszym sposobem wysyłania zapytań do danych jest użycie pojedynczej tabeli lub widoku zawierającego wszystkie potrzebne informacje i odfiltrowanie ich na serwerze przed wyświetleniem w aplikacji. Musisz także upewnić się, że kolumny, których używasz do filtrowania lub sortowania danych, są prawidłowo zaindeksowane. Dzięki temu Twoja aplikacja będzie szybsza i płynniejsza.

Załóżmy na przykład, że masz galerię zawierającą listę klientów i ich sprzedawców. Jeśli przechowujesz informacje o kliencie i sprzedawcy w oddzielnych tabelach, musisz użyć funkcji wyszukiwania, aby uzyskać nazwisko sprzedawcy dla każdego klienta. Spowalnia to aplikację, ponieważ musi wykonać wiele zapytań do drugiej tabeli. Lepszym sposobem jest utworzenie widoku łączącego informacje o kliencie i sprzedawcy w jednej tabeli i użycie tego widoku jako źródło danych w swojej galerii. Wtedy Twoja aplikacja musi uruchomić tylko jedno zapytanie, aby uzyskać wszystkie potrzebne dane.

Istnieje kompromis między szybkością zapytań a normalizacją danych. Normalizacja danych oznacza, że przechowujesz dane tylko raz i unikasz ich powielania. Pomaga to zachować spójność i dokładność danych. Czasami jednak trzeba zduplikować niektóre dane, aby zapytania były szybsze i łatwiejsze. Musisz zrównoważyć te dwa cele w projekcie aplikacji i strukturze tabeli. W przeciwnym razie Twoja aplikacja będzie powolna i opóźniona, ponieważ musi wykonać wiele pracy, aby filtrować i łączyć dane z różnych tabel.

Użyj widoków po stronie serwera

Wyświetlenia są prawdopodobnie najczęstszym narzędziem pomagającym zrównoważyć te cele. Prezentują pojedynczą strukturę tabeli dla zapytań, wstępnie filtrują dane pod kątem tego, czego potrzebujesz w zapytaniu oraz umożliwiają wyszukiwania i łączenia z innymi tabelami. Ponieważ filtry, wyszukiwania i łączenia widoku są obliczane na serwerze, zarówno ładunek, jak i obliczenia po stronie klienta są zminimalizowane.

Unikaj zbyt wielu wyszukiwań w galerii

Galeria może wyświetlać wiele rekordów z pliku źródło danych. Ale czasami musisz pokazać dodatkowe informacje z innego źródło danych, który jest powiązany z oryginalnym. Na przykład masz galerię wyświetlającą listę klientów i chcesz wyświetlić nazwisko sprzedawcy przypisanego do każdego klienta. Nazwisko sprzedawcy jest przechowywane w innym źródło danych niż dane klienta. Aby wyświetlić nazwisko sprzedawcy, musisz użyć funkcji wyszukiwania, która znajdzie pasujący rekord w drugim źródło danych. Spowoduje to rozwinięcie oryginalnej tabeli z wartościami przeglądania.

Jednakże rozwijanie tabeli może być bardzo powolne, jeśli masz wiele rekordów i wiele wyszukiwań. Dla każdego rekordu w galerii aplikacja musi uruchomić osobne zapytanie do innego rekordu źródło danych i uzyskać wartość wyszukiwania. Oznacza to, że aplikacja może wymagać uruchomienia wielu zapytań dla każdego rekordu, co może zająć dużo czasu i wpłynąć na wydajność aplikacji. Ten antywzór jest czasami nazywany problemem „N do kwadratu, (n^2)” lub problemem „N+1”.

Użyj StartsWith lub filtra

Power Fx udostępnia kilka sposobów wyszukiwania danych. Ogólnie rzecz biorąc, używaj wyrażenia wykorzystującego indeks, takiego jak StartsWith lub Filtr zamiast wyrażenia, które odczytuje całą tabelę jak In. Operator In jest odpowiedni w przypadku kolekcji znajdujących się w pamięci lub jeśli zewnętrzna tabela źródło danych jest bardzo mała.

Rozważ powielanie danych

Czasami dostęp do danych w zapytaniu jest powolny, ponieważ są przechowywane w innej lokalizacji lub formacie. Aby przyspieszyć wykonywanie zapytań, możesz skopiować wolne dane i zapisać je lokalnie w tabeli, w której można szybko i łatwo przeglądać zapytania. Oznacza to jednak, że dane lokalne mogą nie być najbardziej aktualną wersją danych oryginalnych. Następnie uruchom inny proces, aby okresowo aktualizować dane lokalne. Procesem tym może być przepływ Power Automate, wtyczka, procedura składowana lub dowolna inna metoda, która może przenosić dane z jednego miejsca do drugiego.

Wymóg częstotliwości aktualizacji danych lokalnych zależy od potrzeb biznesowych. Jak świeże muszą być dane Twojej aplikacji? Załóżmy na przykład, że pracujesz dla firmy Contoso sprzedającej rowery. Lista dostępnych rowerów jest przechowywana w bazie danych Produkty, do której można uzyskać dostęp za pośrednictwem interfejsu API w niestandardowym łączniku. Powiedzmy jednak, że wywołanie API jest powolne, więc decydujesz się skopiować dane produktu i zapisać je lokalnie w tabeli. Następnie tworzysz widok, który łączy Twoją tabelę z innymi danymi istotnymi dla Twojej aplikacji. Tworzysz także przepływ Power Automate, który działa codziennie i aktualizuje Twoją tabelę najnowszymi danymi produktów z API. Dzięki temu Twoja aplikacja będzie mogła szybciej wysyłać zapytania do danych lokalnych, a dane mają najwyżej jeden dzień.

Powielanie danych to powszechna technika stosowana w aplikacjach klasy korporacyjnej, mająca na celu zapewnienie dobrej wydajności. Możesz użyć wtyczki Dataverse, procedury składowane lub przenoszenie danych w celu zduplikowania danych w jednej tabeli zoptymalizowanej pod kątem zapytań. Kluczowe pytanie brzmi: jak aktualne muszą być te dane? Jeśli możesz sobie pozwolić na pewne opóźnienia, możesz użyć tej techniki, aby przyspieszyć swoją aplikację.

Sugestie

Aby osiągnąć ten cel, rozważ następujące pytania i sugestie:

  1. Jak ważne jest, aby klient widział wartość danych w galerii lub siatce danych? Czy dopuszczalne byłoby najpierw wybranie rekordu, a następnie wyświetlenie danych w formularzu?
  2. Czy widok może wykonać prace wstępne niezbędne do wyświetlenia danych we właściwym formacie?
  3. Czy używasz operatora „IN”, w którym będzie działać „StartsWith”?
  4. Jak aktualne muszą być Twoje dane? Czy istnieje strategia powielania danych, której można użyć, aby domyślnie zapytanie działało w pojedynczej tabeli?