Limitation des requêtes
Si une requête crée une charge disproportionnée sur la base de données qui stocke les données Microsoft Dataverse, elle peut priver la base de données de ressources et avoir un impact négatif sur les performances de toutes les opérations sur les données. Lorsque cela se produit, Dataverse commence à limiter cette requête pour permettre à tous les autres scénarios de s’exécuter normalement.
La principale manière dont la limitation des requêtes diffère des Limites de l’API de protection des services est que la limitation des requêtes cible une requête qui provoque une dégradation des performances sans affecter le reste du trafic. Si la requête limitée provient d’une application non interactive, la limitation ne sera probablement pas perceptible pour les utilisateurs finaux. Si la requête provient d’une application interactive, elle affecte les utilisateurs qui exécutent ce scénario particulier.
Comportement de la limitation des requêtes
La limitation peut se manifester de trois manières :
- Un délai est introduit avant chaque exécution de la requête, ce qui ralentit le scénario qui l’utilise
- Une fraction des tentatives d’exécution de la requête échoue avec une des erreur suivantes :
Code d'erreur Code hexadécimal |
Nom | Message |
---|---|---|
-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. |
Erreur Dataverse pour la limitation de requête causée par des anti-modèles
Dataverse limite fortement les requêtes qui utilisent des anti-modèles de requête connus lorsqu’ils sont identifiés comme présentant un risque pour l’état de l’environnement afin d’éviter les pannes.
Lorsqu’une requête échoue en raison de la limitation et qu’elle utilise l’un des anti-modèles, Dataverse renvoie l’erreur unique suivante pour aider à identifier les anti-modèles utilisés par la requête :
Nom:
DataEnginePerformanceValidationIssuesQueryThrottling
Code :0x80048745
Nombre :-2147186875
Message :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
La partie {0}
du message d’exception répertorie l’anti-modèle utilisé par la requête. Si plusieurs anti-modèles sont utilisés par la requête, ils sont séparés par des virgules. Par exemple, si une requête filtre une grande colonne de texte et sélectionne également un grand nombre de colonnes, le message d’exception contient la chaîne PerformanceLargeColumnSearch,LargeAmountOfAttributes
. Le tableau suivant répertorie les anti-modèles avec des liens vers des explications :
Identificateur d’anti-modèle | Lien d’explication |
---|---|
PerformanceLeadingWildCard |
Évitez les caractères génériques en tête dans les conditions de filtrage |
PerformanceLargeColumnSearch |
Évitez d’utiliser des conditions sur de grandes colonnes de texte |
OrderOnEnumAttribute |
Évitez de trier par colonnes de choix |
OrderOnPropertiesFromJoinedTables |
Évitez de trier par colonnes dans les tables associées |
LargeAmountOfAttributes |
Minimiser le nombre de colonnes sélectionnées |
LargeAmountOfLogicalAttributes |
Réduire le nombre de colonnes logiques sélectionnées |
FilteringOnCalculatedColumns |
Évitez d’utiliser des formules ou des colonnes calculées dans des conditions de filtre |
Note
Si une requête contient l’anti-modèle PerformanceLeadingWildCard
ou FilteringOnCalculatedColumns
, une erreur Dataverse différente est générée. Les requêtes qui utilisent l’anti-modèle PerformanceLeadingWildCard
génèrent l’erreur DataEngineLeadingWildcardQueryThrottling
mentionnée sur cette page, et les requêtes qui utilisent l’anti-modèle FilteringOnCalculatedColumns
génèrent l’erreur DataEngineComputedColumnQueryThrottling
mentionnée sur cette page.
Les erreurs DataEngineLeadingWildcardQueryThrottling
et DataEngineComputedColumnQueryThrottling
précèdent l’erreur DataEnginePerformanceValidationIssuesQueryThrottling
; DataEngineLeadingWildcardQueryThrottling
et DataEngineComputedColumnQueryThrottling
continuent d’être générés pour maintenir la compatibilité descendante.
Causes courantes
La plupart des situations où la limitation des requêtes est nécessaire entrent dans l’une de ces deux grandes catégories suivantes :
Certaines requêtes dans un scénario interactif courant sont inefficaces et nécessitent beaucoup de ressources de base de données pour chaque exécution
- Des exemples courants sont une requête enregistrée utilisée dans une grille ou une requête exécutée par un plug-in
Une opération automatisée exécute une requête à un rythme élevé qui consomme beaucoup de ressources de base de données agrégées, même si chaque exécution est moins coûteuse
- Un exemple courant est l’intégration de données qui déplace une grande quantité de données vers ou hors de Dataverse
Comment éviter la limitation des requêtes
La limitation des requêtes dépend de la requête et du scénario dans lequel elle s’exécute, mais il existe des directives communes :
Pour les requêtes lentes à basse fréquence, généralement utilisées dans les applications interactives, la structure de la requête doit être modifiée pour la rendre plus efficace
- Certaines recommandations courantes pour améliorer les performances des requêtes sont disponibles dans Optimiser les performances à l’aide de FetchXml
Pour les applications non interactives, les moyens courants de réduire la charge de la base de données sont les suivants :
- Si vous utilisez ExecuteMultiple (ou un autre mécanisme de traitement par lots), réduisez la taille du lot
- Si l’application a plusieurs fils, réduire le nombre de threads concurrents
- Lorsque ni le traitement par lots ni les demandes de concurrence ne sont utilisés, ajoutez un délai entre les demandes pour réduire le débit des requêtes
Voir aussi
Anti-modèles de requête
Optimiser les performances à l’aide de FetchXml
Optimiser les performances à l’aide de QueryExpression
Limites de l’API de protection des services