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
- Einige allgemeine Richtlinien zur Verbesserung der Abfrageleistung finden Sie unter Leistung mithilfe von FetchXml optimieren
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