Bästa praxis för REST-API:et som exekverar DAX-frågor

Följ dessa rekommendationer för att få ut mest av REST-API:et Kör DAX-frågor i produktionsmiljöer.

Välj rätt slutpunkt

Anmärkning

API:et Kör DAX-frågor är endast tillgängligt för semantiska modeller som finns på en Power BI kapacitet (Premium, Fabric eller Embedded). Semantiska modeller utan kapacitetstilldelning stöds inte.

Power BI erbjuder två REST-API:er för att köra DAX-frågor. Välj den som matchar klientens funktioner:

  • Kör DAX-frågor (pil) – Använd när klientprogrammet kan använda binära Arrow IPC-strömmar. Arrow levererar mindre nyttolaster, förlustfri typfidelitet och deserialisering utan kopiering till kolumnbaserade ramverk som pandas, Polars och Apache Spark. Det här API:et stöder även avancerade parametrar som queryTimeout och resultsetRowcountLimit. Kräver Premium- eller Fabric kapacitet.
  • Execute Queries (JSON) – Använd när din konsument är en plattform med låg kod/ingen kod, Power Automate flöde eller något verktyg som bara kan parsa JSON. Det här API:et fungerar på Pro-, PPU- och Premium/Fabric-kapaciteter men har en hård gräns på 100 000 rader och 1 000 000 värden per fråga.

Om resultatuppsättningen överskrider några hundra rader, matas in i en analyskedja eller kräver exakt typåtergivning bör du använda API för att köra DAX-frågor med Arrow.

Optimera DAX-frågor för Arrow-endpointen

Effektiv DAX minskar både frågekörningstiden och svarsnyttolastens storlek:

  • Returnera endast de kolumner du behöver. Använd SELECTCOLUMNS eller explicita kolumnlistor i stället för att returnera hela tabeller. Varje extra kolumn läggs till i schemat och registrerar batchstorleken.
  • Föredrar SUMMARIZECOLUMNS över ADDCOLUMNS med FILTER. SUMMARIZECOLUMNS skapar effektivare frågeplaner i VertiPaq-motorn.
  • Använd TOPN för att begränsa rader. När du bara behöver de högsta resultaten pressar TOPN begränsningen direkt till motorn istället för att överföra alla rader och filtrera på klientsidan.
  • Undvik komplexa beräknade kolumner i frågor. Mått och aggregeringar är bra, men beräkningar på radnivå i stora tabeller kan betydligt försämra prestandan.
  • Kombinera flera EVALUATE uttryck i en enda begäran. API:t Utför DAX-frågor stöder flera EVALUATE instruktioner i en query sträng, var och en returnerar en separat resultatuppsättning. På så sätt undviks omkostnaderna för separata HTTP-turer.

Hantera autentisering effektivt

  • Cachelagrar och återanvänder token. Använd MSAL:s inbyggda tokencache för att undvika att anropa Microsoft Entra ID på varje begäran. För konfidentiella klientflöden cachelagrar MSAL token automatiskt när du återanvänder samma ConfidentialClientApplication instans.
  • Använd konfidentiella klientautentiseringsuppgifter för tjänster. För obevakade tjänster på mellannivå använder du klientautentiseringsuppgifter (klienthemlighet eller certifikat) i stället för delegerade användartoken. Detta förhindrar beroende av en inloggad användarsession.
  • Föredrar hanterade identiteter i Azure. När tjänsten körs i Azure (App Service, Functions, AKS) använder du en hanterad identitet för att helt eliminera autentiseringshantering.
  • Hantera tokens förfallotid på ett korrekt sätt. Åtkomsttoken upphör vanligtvis att gälla efter en timme. 401 Unauthorized Sök efter svar och uppdatera token innan du försöker igen.

Hantera fel och återförsök

API:et Kör DAX-frågor kan returnera fel på två sätt:

  1. HTTP-nivåfel – Standard-HTTP-statuskoder med en JSON-feltext. Vanliga koder:

    Statuskod Meaning Action
    400 Felaktig begäran (ogiltig DAX, parametrar saknas) Åtgärda begäran – försök inte igen.
    401 Obehörig (förfallen eller ogiltig token) Uppdatera token och försök igen en gång.
    403 Förbjudet (otillräcklig behörighet) Kontrollera att anroparen har behörighet för Bygg och Läsa på den semantiska modellen.
    429 För många förfrågningar (begränsning) Vänta på varaktigheten Retry-After i rubriken och försök sedan igen.
    500 / 502 / 503 Tillfälliga serverfel Försök igen med exponentiell backoff.
  2. Fel på strömnivå – HTTP 200 med en felraduppsättning inbäddad i Arrow-svaret. Kontrollera pilschemametadata för IsError=true och läs FaultCode metadatavärdena och FaultString plus felraderna för detaljerad platsinformation.

För tillfälliga fel ska exponentiell backoff med jitter implementeras. Börja med en sekund, dubbel på varje nytt försök och begränsa till 30 sekunder. Begränsa återförsök till tre eller fyra försök.

Kontrollera resultatuppsättningens storlek

Stora resultatuppsättningar förbrukar minne på både kapaciteten i tjänsten och den anropande klienten. Varje begäran är bunden av kapacitetens minnesgräns.

Så här behåller du resultatuppsättningar hanterbara:

  • Ange resultsetRowcountLimit i begärandetexten. Detta framtvingar en radgräns på serversidan per resultatuppsättning. Om du vet att din konsument bara behöver 10 000 rader anger du gränsen explicit.
  • Använd TOPN i DIN DAX-fråga. TOPN begränsar rader på motornivå, vilket är mer effektivt än att begränsa på klientsidan.
  • Bearbeta dataposter batcherna stegvis. Arrow-svar delas upp i postbatchar med upp till 100 000 rader. I Python itererar du över batchar med reader.read_next_batch() i stället för att anropa reader.read_all() när du arbetar med stora resultat för att hålla minnesanvändningen konstant.

Skydda din tjänst på mellannivå

Om du skapar en tjänst på mellannivå som är en proxytjänst för DAX-frågor till nedströmskonsumenter:

  • Verifiera uppringarens identitet. Autentisera inkommande begäranden med Microsoft Entra ID eller en annan identitetsprovider innan du vidarebefordrar frågor till Power BI. Exponera aldrig API-slutpunkten "Execute DAX Queries" som en öppen proxy.
  • Framtvinga minsta behörighet. Bevilja tjänstens huvudkonto endast de behörigheter som krävs (Bygga och läsa på specifika semantiska modeller). Använd inte administratörs- eller klientorganisationsadministratörsroller för API-åtkomst.
  • Bädda inte in autentiseringsuppgifter i kod. Lagra klienthemligheter i Azure Key Vault eller använd hanterade identiteter. Rotera hemligheter enligt ett regelbundet schema.
  • Sanera DAX-indata. Om ditt mellannivåssystem accepterar DAX-frågetext från anropare ska du validera indata för att förhindra injicering av oväntade operationer.
  • Använd parametern effectiveUsername med försiktighet. Den här parametern gäller Row-Level Säkerhet för en viss användares räkning. Kontrollera att den anropande identiteten har behörighet att personifiera den angivna användaren.

Övervaka och logga

Spåra hälsotillståndet och prestandan för din API-användning:

  • Loggfrågasmetadata – Registrera frågetexten, svarsstorleken, HTTP-statusen och varaktigheten för varje begäran. Detta hjälper dig att identifiera långsamma frågor och oväntade feltoppar.
  • Övervaka begränsningsfrekvenser – Spåra 429 svar som en procentandel av de totala begärandena. En ökande trend indikerar att du måste minska begärandefrekvensen eller sprida belastningen över tid.
  • Mät deserialiseringstiden – För Arrow-svar loggar du den tid som ägnas åt att läsa och materialisera postbatcherna separat från HTTP-tur och retur-tiden. Detta hjälper till att skilja nätverksfördröjning från bearbetning på klientsidan.
  • Använd Application Insights eller motsvarande – Om mellannivån körs i Azure aktiverar du Application Insights för att hämta beroendespårning, felaviseringar och distribuerad spårning från slutpunkt till slutpunkt.
  • Spåra träfffrekvenser för tokencache – Låga cacheträffar innebär frekventa tokenhämtningsanrop, vilket lägger till svarstid och är ett tecken på felkonfigurerad MSAL-cachelagring.