Freigeben über


Abfrage-Drosselung

Wenn eine Abfrage eine unverhältnismäßige Last auf der Datenbank erzeugt, die Microsoft Dataverse Daten speichert, kann sie die Datenbank aushungern und sich negativ auf die Leistung aller Datenoperationen auswirken. In diesem Fall drosselt Dataverse diese Anfrage, sodass alle anderen Szenarien normal ausgeführt werden können.

Der Hauptunterschied zwischen der Abfrage-Drosselung und API-Grenzwerte für den Serviceschutz besteht darin, dass die Abfrage-Drosselung auf eine Abfrage abzielt, die eine Leistungsverschlechterung verursacht, während der Rest des Datenverkehrs davon unberührt bleibt. Wenn die gedrosselte Abfrage aus einer nicht-interaktiven Anwendung stammt, wird die Drosselung für Endbenutzer wahrscheinlich nicht spürbar sein. Wenn die Abfrage aus einer interaktiven Anwendung stammt, wirkt sie sich auf Benutzende aus, die dieses spezielle Szenario ausüben.

Abfrage-Drosselungs-Verhalten

Die Drosselung kann sich auf drei Arten manifestieren:

  • Eine Verzögerung wird vor jeder Ausführung der Abfrage eingeführt, wodurch das Szenario, das sie verwendet, langsamer wird
  • Ein Teil der Versuche, die Abfrage auszuführen, schlägt mit einem der folgenden Fehler fehl:
Fehlercode
Hex-Code
Name des Dataflows Nachricht
-2147187388
0x80048544
DataEngineQueryThrottling This query cannot be executed because it conflicts with query throttling.
-2147187132
0x80048644
DataEngineLeadingWildcardQueryThrottling This query cannot be executed because it conflicts with Query Throttling; the query uses a leading wildcard value in a filter condition, which will cause the query to be throttled more aggressively.
-2147186876
0x80048744
DataEngineComputedColumnQueryThrottling This query cannot be executed because it conflicts with Query Throttling; the query uses a computed column in a filter condition, which will cause the query to be throttled more aggressively.
-2147186875
0x80048745
DataEnginePerformanceValidationIssuesQueryThrottling This query cannot be executed because it conflicts with Query Throttling; the query has performance validation issues ({0}), which will cause the query to be throttled more aggressively.

Dataverse Fehler bei Abfrage-Drosselungen, die durch Antimuster verursacht werden

Dataverse drosselt Abfragen, die bekannte Abfrageantimuster verwenden, stark, wenn sie als Risiko für die Integrität der Umgebung identifiziert werden, um Ausfälle zu verhindern.

Wenn eine Abfrage aufgrund der Drosselung fehltschlägt und die Abfrage eines der Antimuster verwendet, gibt Dataverse den folgenden eindeutigen Fehler zurück, um zu ermitteln, welche Antimuster von der Abfrage verwendet werden:

Name: DataEnginePerformanceValidationIssuesQueryThrottling
Code: 0x80048745
Nummer: -2147186875
Meldung: This query cannot be executed because it conflicts with Query Throttling; the query has performance validation issues ({0}), which will cause the query to be throttled more aggressively. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2162952

Der {0} Teil der Ausnahmemeldung listet das Antimuster auf, das von der Abfrage verwendet wird. Wenn mehrere Antimuster von der Abfrage verwendet werden, werden diese durch Komma getrennt. Wenn eine Abfrage z. B. nach einer großen Textspalte filtert und gleichzeitig eine große Anzahl von Spalten auswählt, enthält die Ausnahmemeldung die Zeichenfolge PerformanceLargeColumnSearch,LargeAmountOfAttributes. In der folgenden Tabelle sind die Antimuster mit Links zu Erläuterungen aufgeführt:

Antimusterbezeichner Erläuterungs-Link
PerformanceLeadingWildCard Vorangestellte Platzhalter in Filterbedingungen vermeiden
PerformanceLargeColumnSearch Bei großen Textspalten die Verwendung von Bedingungen vermeiden
OrderOnEnumAttribute Sortieren nach Auswahlspalten vermeiden
OrderOnPropertiesFromJoinedTables Die Sortierung nach Spalten in zugehörigen Tabellen vermeiden
LargeAmountOfAttributes Die Anzahl der ausgewählten Spalten minimieren
LargeAmountOfLogicalAttributes Minimieren Sie die Anzahl der ausgewählten logischen Spalten
FilteringOnCalculatedColumns Formeln oder berechneten Spalten in Filterbedingungen vermeiden

Anmerkung

Wenn eine Abfrage entweder das PerformanceLeadingWildCard oder das FilteringOnCalculatedColumns Antimuster enthält, wird ein anderer Dataverse Fehler ausgegeben. Abfragen, die das PerformanceLeadingWildCard Antimuster verwenden, lösen den DataEngineLeadingWildcardQueryThrottling auf dieser Seite erwähnten Fehler aus, und Abfragen, die das FilteringOnCalculatedColumns Antimuster verwenden, lösen den DataEngineComputedColumnQueryThrottling auf dieser Seite erwähnten Fehler aus.

Die DataEngineLeadingWildcardQueryThrottling und DataEngineComputedColumnQueryThrottling Fehler sind älter als der DataEnginePerformanceValidationIssuesQueryThrottling Fehler. DataEngineLeadingWildcardQueryThrottling und DataEngineComputedColumnQueryThrottling werden weiterhin ausgelöst, um die Abwärtskompatibilität zu wahren.

Häufige Ursachen

Die meisten Situationen, in denen eine Abfrage-Drosselung notwendig ist, fallen in eine dieser beiden großen Kategorien:

  • Eine Abfrage in einem gängigen interaktiven Szenario ist ineffizient und benötigt für jede Ausführung viele Datenbankressourcen

    • Häufige Beispiele sind eine gespeicherte Abfrage, die in einem Raster verwendet wird, oder eine Abfrage, die von einem Plug-In ausgeführt wird
  • Ein automatisierter Vorgang führt eine Abfrage mit einer hohen Rate aus, was zusammengenommen viele Datenbankressourcen verbraucht, auch wenn jede einzelne Ausführung für sich kostengünstiger ist

    • Ein gängiges Beispiel ist die Datenintegration, bei der eine große Datenmenge nach Dataverse oder daraus heraus verschoben wird

Wie vermeidet man Abfrage-Drosselung

Die Abfrage-Drosselung hängt von der Abfrage und dem Szenario ab, in dem sie ausgeführt wird, aber es gibt einige allgemeine Leitlinien:

  • Für langsame Abfragen mit niedriger Frequenz, die typischerweise in interaktiven Anwendungen verwendet werden, muss die Abfragestruktur geändert werden, um sie effizienter zu machen

  • Für nicht-interaktive Anwendungen sind die üblichen Möglichkeiten, die Datenbanklast zu reduzieren:

    • Wenn Sie ExecuteMultiple (oder ein anderer Batchverarbeitungsmechanismus) verwenden, reduzieren Sie die Batchgröße
    • Wenn die Anwendung mehrere Threads verwendet, reduzieren Sie die Anzahl der gleichzeitigen Threads
    • Wenn Sie weder die Batchverarbeitung noch gleichzeitige Anforderungen verwenden, fügen Sie eine Verzögerung zwischen den Anforderungen ein, um die Anforderungsrate zu reduzieren

Siehe auch

Abfrage-Anti-Muster
Leistung mithilfe von FetchXml optimieren
Die Leistung mit QueryExpression optimieren
API-Grenzwerte für den Serviceschutz