Abfrage-Drosselung
Wenn eine bestimmte Abfrage eine unverhältnismäßige Last auf der Datenbank erzeugt, die Microsoft Dataverse Daten speichert, kann sie die Datenbank aushungern und die Leistung aller Datenoperationen negativ beeinflussen. Wenn dies geschieht, beginnt Dataverse, diese bestimmte Abfrage zu drosseln, sodass alle anderen Szenarien normal ausgeführt werden können.
Der Hauptunterschied zwischen Abfrage-Drosselung und Service-Schutz-API-Limits besteht darin, dass die Abfrage-Drosselung auf eine bestimmte 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 | Nachricht |
---|---|---|
-2147187388 |
0x80048544 |
This query cannot be executed because it conflicts with query throttling. |
-2147187132 |
0x80048644 |
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 |
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. |
Weitere Informationen zu stärker gedrosselten Abfragemustern wie vorangestellte Platzhaltern finden Sie unter Die Leistung mit FetchXml optimieren und Die Leistung mit QueryExpression optimieren
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, z. B. eine gespeicherte Abfrage, die in einem Raster verwendet wird, oder eine Abfrage, die von einem Plug-In ausgeführt wird, ist ineffizient und benötigt bei jeder Ausführung viele Datenbankressourcen
Ein automatisierter Vorgang, z. B. eine Datenintegration, bei der eine große Menge an Daten in oder aus Dataverse verschoben wird, führt eine Abfrage mit einer hohen Rate aus, die insgesamt sehr viele Datenbankressourcen verbraucht, auch wenn die einzelne Ausführung günstiger ist
Wie vermeidet man Abfrage-Drosselung
Die Abfragedrosselung 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