Anti-modèles de requête
La composition de requêtes optimisées pour Dataverse est essentielle pour garantir que les applications offrent une expérience rapide, réactive et fiable. Découvrez les modèles à éviter lors de la composition de requêtes pour des tables standard utilisant le message RetrieveMultiple
ou des messages qui ont un paramètre qui hérite de la classe QueryBase.
Ces instructions s’appliquent également lors de l’envoi d’une requête GET
sur une collection d’enregistrements à l’aide d’OData.
Note
Les conseils présentés ici peuvent ne pas s’appliquer aux tableaux Elastic ou lors de l’utilisation de Dataverse recherche.
Minimiser le nombre de colonnes sélectionnées
N’incluez pas les colonnes dont vous n’avez pas besoin dans votre requête. Les requêtes qui renvoient toutes les colonnes ou incluent un grand nombre de colonnes peuvent rencontrer des problèmes de performances en raison de la taille du jeu de données ou de la complexité de la requête.
Réduire le nombre de colonnes logiques sélectionnées
Vous devez éviter de demander un trop grand nombre de colonnes, en particulier des colonnes logiques. Une colonne logique contient des valeurs stockées dans différentes tables de base de données. La propriété AttributeMetadata.IsLogical vous indique si une colonne est une colonne logique. Les requêtes qui contiennent de nombreuses colonnes logiques sont plus lentes car Dataverse doivent combiner les données d’autres tables de base de données.
Évitez les caractères génériques en tête dans les conditions de filtrage
Les requêtes qui utilisent des conditions avec des caractères génériques de début (soit explicitement, soit implicitement avec un opérateur tel que ends-with
) peuvent entraîner de mauvaises performances. Dataverse ne peut pas profiter des index de base de données lors d’une requête utilisant des caractères génériques de premier plan, ce qui oblige SQL à analyser la table entière. Les analyses de table peuvent se produire même s’il existe d’autres requêtes génériques non principales qui limitent le jeu de résultats.
L’exemple suivant est un élément de condition FetchXml qui utilise un caractère générique de début :
<condition attribute='accountnumber'
operator='like'
value='%234' />
Lorsque le délai d’attente des requêtes expire et que ce modèle est détecté, Dataverse renvoie une erreur unique pour aider à identifier les requêtes qui utilisent ce modèle :
Nom:
LeadingWildcardCauseTimeout
Code :0x80048573
Nombre :-2147187341
Message :The database operation timed out; this may be due to a leading wildcard value being used in a filter condition. Please consider removing filter conditions on leading wildcard values, as these filter conditions are expensive and may cause timeouts.
Dataverse limite fortement les requêtes de caractères génériques de début qui 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 d’une limitation et que ce modèle est détecté, Dataverse renvoie une erreur unique :
Nom:
DataEngineLeadingWildcardQueryThrottling
Code :0x80048644
Nombre :-2147187132
Message :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.
Si vous utilisez des requêtes génériques de premier plan, étudiez ces options :
- Utiliser Dataverse la recherche à la place.
- Modifiez votre modèle de données pour aider les gens à éviter d’avoir besoin de caractères génériques de premier plan.
Autres caractères génériques
Comme décrit dans la section Utiliser des caractères génériques dans les conditions pour les valeurs de chaîne, d’autres caractères au-delà du signe de pourcentage (« % ») peuvent agir comme un caractère générique. Voici deux exemples de chaînes de requête qui se comportent également comme des caractères génériques de début :
_234%
[^a]234%
Dataverse limite fortement les requêtes avec des chaînes de recherche qui commencent par ces autres caractères génériques de début.
Trait d’union
Les règles de tri Unicode de classement de base de données font que certaines chaînes de recherche commençant par un trait d’union (« - ») fonctionnent comme des recherches de caractères génériques de début. Les chaînes de recherche commençant par un trait d’union ne peuvent pas tirer parti des index de base de données si la chaîne de recherche ne contient pas de caractère non générique avant l’occurrence du caractère « % » dans la chaîne. Par exemple, -%
et -%234
ne peuvent pas utiliser efficacement les index de base de données, tandis que -234%
le peut. Dataverse limite considérablement les chaînes de recherche inefficaces qui commencent par des traits d’union. Pour en savoir plus sur les règles de tri Unicode du classement de base de données pour les traits d’union, consultez Classements SQL Server.
Évitez d’utiliser des formules ou des colonnes calculées dans des conditions de filtre
Les valeurs des formules et colonnes calculées en temps réel quand elles sont récupérées. Les requêtes qui utilisent des filtres sur ces colonnes obligent Dataverse à calculer la valeur de chaque enregistrement possible pouvant être renvoyé afin que le filtre puisse être appliqué. Les requêtes sont plus lentes car Dataverse ne peut pas améliorer les performances de ces requêtes à l’aide de SQL.
Lorsque le délai d’attente des requêtes expire et que ce modèle est détecté, Dataverse renvoie une erreur unique pour aider à identifier les requêtes qui utilisent ce modèle :
Nom:
ComputedColumnCauseTimeout
Code :0x80048574
Nombre :-2147187340
Message :The database operation timed out; this may be due to a computed column being used in a filter condition. Please consider removing filter conditions on computed columns, as these filter conditions are expensive and may cause timeouts.
Dataverse limite fortement les requêtes comportant des filtres sur des colonnes calculées identifiées comme présentant un risque pour l’état de l’environnement afin d’éviter les pannes. Lorsqu’une requête échoue en raison d’une limitation et que ce modèle est détecté, Dataverse renvoie une erreur unique :
Nom:
DataEngineComputedColumnQueryThrottling
Code :0x80048744
Nombre :-2147186876
Message :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.
Évitez de trier par colonnes de choix
Lorsque vous utilisez FetchXml ou QueryExpression pour classer les résultats de requête à l’aide d’une colonne de choix, les résultats sont triés à l’aide de l’étiquette localisée pour chaque option de choix. Trier par la valeur numérique stockée dans la base de données ne fournirait pas une bonne expérience dans votre application. Vous devez savoir que le classement des colonnes de choix nécessite davantage de ressources de calcul pour joindre et trier les lignes en fonction de la valeur d’étiquette localisée. Ce travail supplémentaire ralentit la requête. Si possible, essayez d’éviter de trier les résultats par valeurs de colonne de choix.
Note
OData est différent. Avec l’API web Dataverse, $orderby
trie les lignes en utilisant la valeur entière de la colonne de choix au lieu de l’étiquette localisée.
Évitez de trier par colonnes dans les tables associées
Le classement par colonnes sur les tables associées ralentit la requête en raison de la complexité supplémentaire.
Le classement par tables associées ne doit être effectué qu’en cas de besoin, comme décrit ici :
Évitez d’utiliser des conditions sur de grandes colonnes de texte
Dataverse dispose de deux types de colonnes pouvant stocker de grandes chaînes de texte :
- StringAttributeMetadata peuvent stocker un maximum de 4 000 caractères.
- MemoAttributeMetadata peut stocker un nombre plus élevé.
La limite pour ces deux colonnes est spécifiée à l’aide de la propriété MaxLength
.
Vous pouvez utiliser des conditions sur les colonnes de chaîne dont a MaxLength
est configuré pour moins de 850 caractères.
Toutes les colonnes mémo ou colonnes de chaîne avec un MaxLength
supérieur à 850 sont définies dans Dataverse en tant que grandes colonnes de texte. Les grandes colonnes de texte sont trop volumineuses pour être indexées efficacement, ce qui entraîne de mauvaises performances lorsqu’elles sont incluses dans une condition de filtre.
La recherche Dataverse est un meilleur choix pour interroger des données dans ces types de colonnes.
Erreur Dataverse pour les délais d’expiration de requête causés par des anti-modèles
Lorsqu’une requête expire et qu’elle utilise l’un des anti-modèles détaillés sur cette page, Dataverse renvoie l’erreur unique suivante pour aider à identifier les anti-modèles utilisés par la requête :
Nom:
PerformanceValidationIssuesCauseTimeout
Code :0x80048575
Nombre :-2147187339
Message :The database operation timed out; this may be due to the query performance issues identified in a query executed on this request. Please optimize the query by addressing the following identified performance issues: {0}. Please reference this document for guidance: https://go.microsoft.com/fwlink/?linkid=2300520
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 |
Utilisez les instructions de cette page pour comprendre les anti-modèles et modifier la requête pour éviter d’utiliser ces anti-modèles.
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 LeadingWildcardCauseTimeout
mentionnée sur cette page, et les requêtes qui utilisent l’anti-modèle FilteringOnCalculatedColumns
génèrent l’erreur ComputedColumnCauseTimeout
mentionnée sur cette page.
Les erreurs LeadingWildcardCauseTimeout
et ComputedColumnCauseTimeout
précèdent l’erreur PerformanceValidationIssuesCauseTimeout
; LeadingWildcardCauseTimeout
et ComputedColumnCauseTimeout
continuent d’être générés pour maintenir la compatibilité descendante.
Articles associés
Limitation des requêtes
Utilisez des caractères génériques dans les conditions pour les valeurs de chaîne
Interroger des données à l’aide de FetchXml
Interroger les données à l’aide de QueryExpression
Interroger des données à l’aide d’OData