Bewährte Methoden für die REST-API zum Ausführen von DAX-Abfragen

Befolgen Sie diese Empfehlungen, um die REST-API "DAX-Abfragen ausführen" in Produktionsworkloads optimal zu verwenden.

Wählen Sie den richtigen Endpunkt aus.

Hinweis

Die EXECUTE DAX-Abfragen-API ist nur für semantische Modelle verfügbar, die sich auf einer Power BI Kapazität (Premium, Fabric oder Embedded) befinden. Semantische Modelle ohne Kapazitätszuweisung werden nicht unterstützt.

Power BI bietet zwei REST-APIs zum Ausführen von DAX-Abfragen. Wählen Sie die Option aus, die den Funktionen Ihres Clients entspricht:

  • Ausführen von DAX-Abfragen (Pfeil) – Verwenden Sie, wann immer Ihre Clientanwendung Binäre Pfeil-IPC-Datenströme verwenden kann. Arrow liefert kleinere Nutzlasten, verlustlose Typtreue und eine Zero-Copy-Deserialisierung in Spaltenframeworks wie Pandas, Polars und Apache Spark. Diese API unterstützt auch erweiterte Parameter wie queryTimeout und resultsetRowcountLimit. Erfordert Premium- oder Fabric-Kapazität.
  • Execute Queries (JSON) – Verwenden Sie diese Einstellung, wenn Es sich bei Ihrem Consumer um eine Plattform mit geringem Code/No-Code handelt, Power Automate Flow oder ein beliebiges Tool, das nur JSON analysieren kann. Diese API funktioniert für Pro-, PPU- und Premium/Fabric-Kapazitäten, hat jedoch eine harte Grenze von 100.000 Zeilen und 1.000.000 Werten pro Abfrage.

Wenn Ihr Resultset in der Regel ein paar hundert Zeilen überschreitet, in eine Analysepipeline eingespeist wird oder eine genaue Typtreue erfordert, verwenden Sie die Execute DAX-Queries API mit Arrow.

Optimieren von DAX-Abfragen für den Arrow-Endpunkt

Effizientes DAX reduziert sowohl die Abfrageausführungszeit als auch die Antwortgröße.

  • Geben Sie nur die benötigten Spalten zurück. Verwenden Sie entweder SELECTCOLUMNS oder explizite Spaltenlisten, anstatt ganze Tabellen zurückzugeben. Jede zusätzliche Spalte wird dem Schema und der Datensatzbatchgröße hinzugefügt.
  • SUMMARIZECOLUMNS bevorzugen gegenüber ADDCOLUMNS mit FILTER. SUMMARIZECOLUMNS erzeugt effizientere Abfragepläne im VertiPaq-Modul.
  • Man verwendet TOPN, um Zeilen einzuschränken. Wenn Sie nur die Top-Ergebnisse benötigen, überträgt TOPN den Grenzwert an die Engine, anstatt alle Zeilen zu übertragen und clientseitig zu filtern.
  • Vermeiden Sie komplexe berechnete Spalten in Abfragen. Measures und Aggregationen sind in Ordnung, aber Zeilenebenenberechnungen für große Tabellen können die Ausführung erheblich verlangsamen.
  • Kombinieren Sie mehrere EVALUATE Anweisungen in einer einzigen Anforderung. Die Execute DAX-Abfrage-API unterstützt mehrere EVALUATE Anweisungen innerhalb einer query Zeichenfolge, wobei jeweils eine separate Ergebnismenge zurückgegeben wird. Dadurch wird der Aufwand für separate HTTP-Roundtrips vermieden.

Effizientes Verwalten der Authentifizierung

  • Zwischenspeichern und Wiederverwenden von Token Verwenden Sie den integrierten Tokencache von MSAL, um das Aufrufen von Microsoft Entra ID für jede Anforderung zu vermeiden. Bei vertraulichen Clientflüssen speichert MSAL Token automatisch zwischen, wenn Sie dieselbe ConfidentialClientApplication Instanz wiederverwenden.
  • Verwenden Sie vertrauliche Clientanmeldeinformationen für Dienste. Verwenden Sie für unbeaufsichtigte Mid-Tier-Dienste Clientanmeldeinformationen (geheimer Clientschlüssel oder Zertifikat) anstelle delegierter Benutzertoken. Dadurch wird eine Abhängigkeit von einer angemeldeten Benutzersitzung vermieden.
  • Bevorzugen Sie verwaltete Identitäten in Azure. Wenn Ihr Dienst in Azure ausgeführt wird (App Service, Funktionen, AKS), verwenden Sie eine verwaltete Identität, um die Verwaltung von Anmeldeinformationen vollständig zu beseitigen.
  • Behandeln Sie das Ablauf von Tokens ordnungsgemäß. Zugriffstoken laufen in der Regel nach einer Stunde ab. Prüfen Sie auf 401 Unauthorized-Antworten und aktualisieren Sie das Token, bevor Sie es erneut versuchen.

Behandeln von Fehlern und Wiederholungen

Die EXECUTE DAX-Abfragen-API kann Auf zwei Arten Fehler zurückgeben:

  1. FEHLER auf HTTP-Ebene – Standardmäßige HTTP-Statuscodes mit einem JSON-Fehlertext. Allgemeine Codes:

    Statuscode Bedeutung Action
    400 Ungültige Anforderung (ungültige DAX, fehlende Parameter) Beheben Sie die Anforderung – wiederholen Sie den Vorgang nicht.
    401 Nicht autorisiert (abgelaufenes oder ungültiges Token) Aktualisieren Sie das Token, und wiederholen Sie es einmal.
    403 Verboten (unzureichende Berechtigungen) Stellen Sie sicher, dass der Aufrufer über Build- und Leseberechtigungen für das semantische Modell verfügt.
    429 Zu viele Anforderungen (gedrosselt) Warten Sie auf die Dauer in der Retry-After Kopfzeile, und versuchen Sie es dann erneut.
    500 / 502 / 503 Vorübergehende Serverfehler Wiederholen Sie den Vorgang mit exponentiellem Backoff.
  2. Fehler auf Streamebene – HTTP 200 mit einem in die Pfeilantwort eingebetteten Fehlerzeilensatz. Überprüfen Sie die Arrow-Schemametadaten für IsError=true und lesen Sie die FaultCode- und FaultString-Metadatenwerte sowie die Fehlerzeilen für detaillierte Standortinformationen.

Implementieren Sie bei vorübergehenden Fehlern ein exponentielles Zurücksetzen mit Jitter. Beginnen Sie mit einer Sekunde, verdoppeln Sie bei jedem weiteren Versuch und begrenzen Sie es auf 30 Sekunden. Beschränken Sie Wiederholungsversuche auf drei oder vier Versuche.

Größe des Ergebnissatzes steuern

Große Resultsets verbrauchen Arbeitsspeicher sowohl für die Kapazität im Dienst als auch für den aufrufenden Client. Jede Anforderung ist an die Speichergrenze der Kapazität gebunden.

Um Ergebnismengen verwaltbar zu halten:

  • Setzen Sie resultsetRowcountLimit im Anforderungstext fest. Dadurch wird ein serverseitiges Zeilenlimit pro Resultset erzwungen. Wenn Sie wissen, dass Ihr Verbraucher nur 10.000 Zeilen benötigt, legen Sie den Grenzwert explizit fest.
  • Verwenden Sie TOPN in Ihrer DAX-Abfrage. TOPN begrenzt Zeilen auf der Engine-Ebene, was effizienter ist als die clientseitige Kürzung.
  • Verarbeiten Sie Datensatz-Batches inkrementell. Antworten für Arrow werden in Datensatzbatches von bis zu 100.000 Zeilen aufgeteilt. In Python iterieren Sie über Batches mit reader.read_next_batch() statt reader.read_all() aufzurufen, wenn Sie mit großen Ergebnissen arbeiten, um die Speichernutzung konstant zu halten.

Sichern Sie Ihren Dienst der mittleren Ebene

Wenn Sie einen Mid-Tier-Dienst erstellen, der DAX-Abfragen für downstream-Consumer proxiest:

  • Überprüfen der Anruferidentität. Authentifizieren Sie eingehende Anforderungen mit Microsoft Entra ID oder einem anderen Identitätsanbieter, bevor Sie Abfragen an Power BI weiterleiten. Stellen Sie niemals den Endpunkt "DAX-Abfragen ausführen" als geöffneten Proxy zur Verfügung.
  • Erzwingen Sie das Prinzip des geringsten Privilegs. Gewähren Sie dem Dienstprinzipal nur die erforderlichen Berechtigungen (Erstellen und Lesen auf bestimmten semantischen Modellen). Verwenden Sie keine Arbeitsbereichsadministrator- oder Mandantenadministratorrollen für den API-Zugriff.
  • Betten Sie keine Anmeldeinformationen in Code ein. Speichern sie geheime Clientschlüssel in Azure Key Vault oder verwenden Sie verwaltete Identitäten. Wechseln Sie Geheimnisse regelmäßig.
  • DAX-Eingaben bereinigen. Wenn Ihre mittlere Ebene DAX-Abfragetext von Aufrufern akzeptiert, überprüfen Sie die Eingabe, um die Einfügung unerwarteter Vorgänge zu verhindern.
  • Verwenden Sie den effectiveUsername Parameter mit Bedacht. Dieser Parameter wendet Row-Level Sicherheit im Auftrag eines bestimmten Benutzers an. Stellen Sie sicher, dass die aufrufende Identität berechtigt ist, den angegebenen Benutzer nachzuahmen.

Überwachen und Protokollieren

Verfolgen Sie den Status und die Leistung Ihrer API-Nutzung:

  • Protokollabfragemetadaten – Notieren Sie den Abfragetext, die Antwortgröße, den HTTP-Status und die Dauer für jede Anforderung. Dadurch können langsame Abfragen und unerwartete Fehlerspitzen identifiziert werden.
  • Überwachen der Drosselungsraten – Nachverfolgen 429 von Antworten als Prozentsatz der Gesamtanforderungen. Ein steigender Trend gibt an, dass Sie die Anforderungshäufigkeit reduzieren oder die Last über einen Zeitraum verteilen müssen.
  • Messen Sie die Deserialisierungszeit – Protokollieren Sie für Arrow-Antworten die Zeit, die für das Lesen und Materialisieren von Datensatzbatches aufgewendet wird, getrennt von der HTTP-Roundtripzeit. Dadurch wird die Netzwerklatenz von der clientseitigen Verarbeitung unterschieden.
  • Application Insights oder gleichwertig – Wenn Ihre Mittelschicht in Azure ausgeführt wird, aktivieren Sie Application Insights, um Abhängigkeitsnachverfolgung, Fehlerwarnungen und End-to-End verteilte Ablaufverfolgung zu erhalten.
  • Nachverfolgen von Tokencachetreffraten – Niedrige Cachetreffraten bedeuten häufige Tokenerwerbsaufrufe, die Latenz hinzufügen und ein Zeichen für falsch konfigurierte MSAL-Zwischenspeicherung sind.