Partage via


Optimiser les performances à l’aide de QueryExpression

Pour obtenir des conseils sur les aspects généraux à éviter lors de la composition de requêtes Dataverse, consultez Anti-modèles de requête. Les sections suivantes sont spécifiques à QueryExpression.

Indicateurs de requête

Important

Appliquez ces options uniquement lorsqu’elles sont recommandées par le support technique Microsoft. Une utilisation incorrecte de ces options peut dégrader les performances d’une requête.

Microsoft SQL Server prend en charge plusieurs indicateurs de requête pour optimiser les requêtes. QueryExpression Le langage FetchXML prend en charge les indicateurs de requête et peut transmettre ces options de requête à SQL Server avec propriété QueryExpression.QueryHints.

Option de requête Conseil SQL Server
ForceOrder Forcer l’ordre
DisableRowGoal Conseil : DISABLE_OPTIMIZER_ROWGOAL
EnableOptimizerHotfixes Conseil : ENABLE_QUERY_OPTIMIZER_HOTFIXES
LoopJoin Mettre en boucle la jonction
MergeJoin Fusionner la jonction
HashJoin Hacher la jonction
NO_PERFORMANCE_SPOOL NO_PERFORMANCE_SPOOL
ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS Conseil : ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS

Plus d’information : Conseils (Transact-SQL) - Requête

Aucun verrou

Dans les versions antérieures, la propriété QueryExpression.NoLock utilisée pour empêcher les verrous partagés sur les enregistrements. Il n’est plus nécessaire d’inclure cette propriété

Indicateur d’union

Vous pouvez améliorer les performances en ajoutant un FilterExpression qui définit le ConditionExpression des colonnes dans différentes tables en définissant le FilterExpression.FilterHint propriété à union. Mais certaines restrictions s’appliquent :

  • Le FilterExpression.FilterOperator doit utiliser LogicalOperator.Or.
  • Chaque requête ne peut contenir qu’un seul indicateur union.
  • Si un FilterExpression avec conseil union n’est pas au niveau du filtre supérieur, Dataverse transforme la requête et déplace le filtre avec un union conseil au filtre racine.
  • Si un indicateur union dispose de plus de trois niveaux de profondeur, il est ignoré.

L’exemple suivant définit un filtre avec l’indicateur union sur la colonne telephone1 à la fois pour les tables compte et contact.

QueryExpression query = new("email")
{
   ColumnSet = new ColumnSet("activityid", "subject"),
   Criteria = new FilterExpression(LogicalOperator.And)
   {
      Conditions = {
         {
            new ConditionExpression(
               attributeName:"subject",
               conditionOperator:ConditionOperator.Like,
               value: "Alert:%")
         },
         {
            new ConditionExpression(
               attributeName:"statecode",
               conditionOperator:ConditionOperator.Equal,
               value: 0)
         }
      },
      Filters = {
         {
            new FilterExpression(LogicalOperator.Or){
               FilterHint = "union",
               Conditions = {
                  {
                     new ConditionExpression(
                        attributeName:"telephone1",
                        conditionOperator:ConditionOperator.Equal,
                        value: "555-123-4567"){
                           EntityName = "ac"
                        }
                  },
                  {
                     new ConditionExpression(
                        attributeName:"telephone1",
                        conditionOperator:ConditionOperator.Equal,
                        value: "555-123-4567"){
                           EntityName = "co"
                        }
                  }
               }
            }
         }
      }
   }
};        

LinkEntity linkToAccount = query.AddLink(
      linkToEntityName: "account",
      linkFromAttributeName: "regardingobjectid",
      linkToAttributeName: "accountid",
      joinOperator: JoinOperator.LeftOuter);
linkToAccount.EntityAlias = "ac";

LinkEntity linkToContact = query.AddLink(
      linkToEntityName: "contact",
      linkFromAttributeName: "regardingobjectid",
      linkToAttributeName: "contactid",
      joinOperator: JoinOperator.LeftOuter);
linkToContact.EntityAlias = "co";

Voir aussi

Interroger les données à l’aide de QueryExpression
Sélectionner des colonnes à l’aide de QueryExpression
Joindre des tables à l’aide de QueryExpression
Ordonner les lignes à l’aide de QueryExpression
Filtrer les lignes à l’aide de QueryExpression
Résultats de page à l’aide de QueryExpression
Agréger les données à l’aide de QueryExpression
Compter les lignes à l’aide de QueryExpression
Anti-modèles de requête