Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Postępuj zgodnie z tymi zaleceniami, aby jak najlepiej wykorzystać interfejs API REST wykonywania zapytań języka DAX w obciążeniach produkcyjnych.
Wybieranie odpowiedniego punktu końcowego
Uwaga / Notatka
Interfejs API wykonywania zapytań języka DAX jest dostępny tylko dla modeli semantycznych znajdujących się w pojemności Power BI (Premium, Fabric lub Embedded). Modele semantyczne bez przypisania pojemności nie są obsługiwane.
Power BI oferuje dwa interfejsy API REST do wykonywania zapytań języka DAX. Wybierz tę, która jest zgodna z możliwościami klienta:
-
Wykonywanie zapytań języka DAX (Arrow) — używaj, gdy aplikacja kliencka może korzystać ze strumieni binarnych IPC Arrow. Arrow dostarcza mniejsze obciążenia danych, zapewniając bezstratną wierność typów oraz deserializację bezpośrednią w strukturach kolumnowych, takich jak pandas, Polars i Apache Spark. Ten interfejs API obsługuje również zaawansowane parametry, takie jak
queryTimeoutiresultsetRowcountLimit. Wymaga pojemności Premium lub Fabric. - Execute Queries (JSON) — Użyj, gdy konsumentem jest platforma niskokodowa/bez kodu, przepływ Power Automate lub dowolne narzędzie, które może analizować tylko JSON. Ten interfejs API działa w pojemnościach Pro, PPU i Premium/Fabric, ale ma twardy limit 100 000 wierszy i 1000 000 wartości na zapytanie.
Ogólnie rzecz biorąc, jeśli zestaw wyników przekracza kilkaset wierszy, jest zasilany do potoku analitycznego lub wymaga dokładnej zgodności typów, użyj API wykonywania zapytań DAX z Apache Arrow.
Optymalizacja zapytań DAX dla punktu końcowego Arrow
Wydajny język DAX skraca czas wykonywania zapytania i rozmiar ładunku odpowiedzi:
- Zwróć tylko potrzebne kolumny. Użyj
SELECTCOLUMNSlub jawnych list kolumn zamiast zwracać całe tabele. Każda dodatkowa kolumna zwiększa schemat i rozmiar partii rekordu. - Preferuj
SUMMARIZECOLUMNSzamiastADDCOLUMNSzFILTER.SUMMARIZECOLUMNStworzy bardziej wydajne plany zapytań w aparacie VertiPaq. - Użyj polecenia
TOPN, aby ograniczyć wiersze. Kiedy potrzebujesz tylko najlepszych wyników,TOPNprzesuwa limit do silnika, zamiast przesyłać wszystkie wiersze i filtrować po stronie klienta. - Unikaj złożonych kolumn obliczeniowych w zapytaniach. Miary i agregacje są poprawne, ale obliczenia na poziomie wiersza w dużych tabelach mogą znacznie spowalniać wykonywanie.
- Łączenie wielu
EVALUATEwyrażeń w jednym żądaniu. Interfejs API wykonywania zapytań języka DAX obsługuje wieleEVALUATEinstrukcji wewnątrz jednegoqueryciągu, z których każdy zwraca oddzielny zestaw wyników. Pozwala to uniknąć narzutu wynikającego z oddzielnych transakcji HTTP.
Efektywne zarządzanie uwierzytelnianiem
- Buforowanie i ponowne używanie tokenów. Użyj wbudowanej pamięci podręcznej tokenów biblioteki MSAL, aby uniknąć wywoływania Microsoft Entra ID na każdym żądaniu. W przypadku poufnych przepływów klienckich, tokeny MSAL są buforowane automatycznie podczas ponownego użycia tego samego
ConfidentialClientApplicationwystąpienia. - Użyj poufnych poświadczeń klienta dla usług. W przypadku nienadzorowanych usług warstwy środkowej należy użyć poświadczeń klienta (klucza tajnego lub certyfikatu klienta) zamiast delegowanych tokenów użytkownika. Pozwala to uniknąć zależności od sesji zalogowanego użytkownika.
- Zaleca się preferowanie tożsamości zarządzanych na platformie Azure. Gdy usługa działa w Azure (App Service, Functions, AKS), użyj tożsamości zarządzanej, aby całkowicie wyeliminować zarządzanie poświadczeniami.
- Bezproblemowa obsługa wygasania tokenu. Tokeny dostępu zwykle wygasają po godzinie.
401 UnauthorizedPrzed ponowieniu próby sprawdź odpowiedzi i odśwież token.
Obsługa błędów i ponownych prób
Interfejs API wykonywania zapytań języka DAX może zwracać błędy na dwa sposoby:
Błędy na poziomie HTTP — standardowe kody stanu HTTP z treścią błędu JSON. Typowe kody:
Kod stanu Meaning Akcja 400Nieprawidłowe żądanie (błędny DAX, brakujące parametry) Popraw żądanie — nie wznawiaj. 401Brak autoryzacji (wygasł lub nieprawidłowy token) Odśwież token i spróbuj ponownie raz. 403Zabronione (niewystarczające uprawnienia) Sprawdź, czy obiekt wywołujący ma uprawnienia kompilacji i odczytu w modelu semantycznym. 429Zbyt wiele żądań (limitowane) Poczekaj na czas określony w nagłówku Retry-After, po czym ponów próbę.500/502/503Przejściowe błędy serwera Ponów próbę z wycofywaniem wykładniczym. Błędy na poziomie strumienia — HTTP 200 z zestawem wierszy błędów osadzonym w odpowiedzi strzałki. Sprawdź metadane schematu Arrow dotyczące
IsError=truei odczytaj wartości metadanych zFaultCodeoraz wiersze błędów zFaultString, aby uzyskać szczegółowe informacje o lokalizacji.
W przypadku błędów przejściowych zaimplementuj wycofywanie wykładnicze z zakłóceniami. Rozpocznij od jednej sekundy, podwajaj czas przy każdej kolejnej próbie i ogranicz do 30 sekund. Ogranicz ponawianie prób do trzech lub czterech prób.
Kontrolowanie rozmiaru zestawu wyników
Duże zestawy wyników zużywają pamięć zarówno w pojemności usługi, jak i klienta wywołującego. Każde żądanie jest ograniczone limitem pamięci zasobów systemowych.
Aby zachować możliwość zarządzania zestawami wyników:
- Ustaw
resultsetRowcountLimitw treści żądania. Wymusza to limit wierszy po stronie serwera dla zestawu wyników. Jeśli wiesz, że użytkownik potrzebuje tylko 10 000 wierszy, ustaw jawnie limit. - Użyj
TOPNw zapytaniu języka DAX.TOPNogranicza wiersze na poziomie silnika, co jest bardziej wydajne niż skracanie po stronie klienta. - Przetwarzaj partie rekordów przyrostowo. Odpowiedzi Arrow są podzielone na partie rekordów z maksymalnie 100 000 wierszy. W Pythonie iteruj po paczkach przy użyciu
reader.read_next_batch()zamiast wywoływaniareader.read_all()podczas operowania na dużych wynikach, aby utrzymać stałe zużycie pamięci.
Zabezpiecz usługę warstwy średniej
Jeśli tworzysz usługę warstwy średniej, która pośredniczy w przetwarzaniu zapytań języka DAX dla końcowych odbiorców:
- Zweryfikuj tożsamość wywołującego. Uwierzytelnij przychodzące żądania za pomocą Microsoft Entra ID lub innego dostawcy tożsamości, zanim przekażesz zapytania do Power BI. Nigdy nie udostępniaj punktu końcowego zapytań DAX jako otwartego serwera proxy.
- Egzekwowanie zasady najmniejszych uprawnień. Przyznaj jednostce usługi tylko wymagane uprawnienia (Kompiluj i odczyt dla określonych modeli semantycznych). Nie używaj ról administratora obszaru roboczego ani administratora dzierżawy na potrzeby dostępu do interfejsu API.
- Nie osadzaj poświadczeń w kodzie. Przechowuj tajemnice klienta w Azure Key Vault lub używaj tożsamości zarządzanych. Obracaj tajne dane w regularnym harmonogramie.
- Wyczyść dane wejściowe DAX. Jeśli warstwa środkowa akceptuje tekst zapytania języka DAX od osób wywołujących, zweryfikuj dane wejściowe, aby zapobiec wstrzyknięciu nieoczekiwanych operacji.
- Użyj parametru
effectiveUsernamez ostrożnością. Ten parametr stosuje zabezpieczenie na poziomie wiersza w imieniu określonego użytkownika. Upewnij się, że tożsamość wywołująca jest autoryzowana do personifikacji określonego użytkownika.
Monitorowanie i rejestrowanie
Śledź kondycję i wydajność użycia interfejsu API:
- Metadane zapytania dziennika — rejestruj tekst zapytania, rozmiar odpowiedzi, stan HTTP i czas trwania każdego żądania. Pomaga to zidentyfikować powolne zapytania i nieoczekiwane skoki błędów.
-
Monitorowanie szybkości ograniczania przepływności — śledzenie
429odpowiedzi jako procent całkowitych żądań. Rosnący trend wskazuje, że musisz zmniejszyć częstotliwość żądań lub rozłożyć obciążenie w czasie. - Mierzenie czasu deserializacji — w przypadku odpowiedzi w formacie Arrow zarejestruj czas spędzony na odczytywaniu i materializowaniu pakietów rekordów niezależnie od czasu trwania rundy HTTP. Ułatwia to odróżnienie opóźnienia sieci od przetwarzania po stronie klienta.
- Użyj usługi Application Insights lub równoważnej — jeśli w Azure działa warstwa środkowa, włącz usługę Application Insights, aby uzyskać śledzenie zależności, alerty o błędach i kompleksowe śledzenie rozproszone.
- Śledź liczby trafień pamięci podręcznej tokenu — niska liczba trafień pamięci podręcznej oznacza częste wywołania pozyskiwania tokenów, które dodają opóźnienie i są oznaką błędnie skonfigurowanego buforowania MSAL.