Partekatu honen bidez:


Optimizar el rendimiento utilizando QueryExpression

Para obtener instrucciones sobre los aspectos generales que se deben evitar al redactar consultas de Dataverse, consulte Antipatrones de consulta. Las secciones siguientes son específicas de QueryExpression.

Sugerencias de consulta

Importante

Aplique estas opciones únicamente cuando lo recomiende el soporte técnico de Microsoft. El uso incorrecto de estas opciones puede dañar el rendimiento de una consulta.

Microsoft SQL Server admite muchas sugerencias de consulta para optimizar las consultas. QueryExpression admite sugerencias de consulta y puede pasar estas opciones de consulta a SQL Server usando la propiedad QueryExpression.QueryHints.

Opción de consulta Sugerencia de SQL Server
ForceOrder Forzar orden
DisableRowGoal Sugerencia: DISABLE_OPTIMIZER_ROWGOAL
EnableOptimizerHotfixes Sugerencia: ENABLE_QUERY_OPTIMIZER_HOTFIXES
LoopJoin Combinación de bucle
MergeJoin Combinación de mezcla
HashJoin Combinación hash
NO_PERFORMANCE_SPOOL NO_PERFORMANCE_SPOOL
ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS Sugerencia: ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS

Más información: Sugerencias (Transact-SQL) - Consulta

Sin bloqueo

En versiones anteriores, la propiedad QueryExpression.NoLock se usaba para evitar bloqueos compartidos en registros. Ya no es necesario incluir esta propiedad

Sugerencia de combinación

Puede mejorar el rendimiento al agregar un FilterExpression que establece el ConditionExpression para columnas en diferentes tablas configurando la propiedad FilterExpression.FilterHint en union. Pero existen algunas restricciones:

  • FilterExpression.FilterOperator debe usar LogicalOperator.Or.
  • Cada consulta puede contener sólo una sugerencia de union.
  • Si una FilterExpression con sugerencia de union no está en el filtro de nivel superior, Dataverse transforma la consulta y mueve el filtro con una sugerencia de union al filtro raíz.
  • Si la sugerencia de union tiene más de tres niveles de profundidad, se ignora.

El siguiente ejemplo establece un filtro con la sugerencia de union en la columna telephone1 para las tablas cuenta y contacto.

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";

Optimización automática de consultas

No se sorprenda cuando el rendimiento de una consulta lenta mejora sin ningún cambio en su parte. Dataverse supervisa activamente las operaciones de recuperación de datos para mejorar el rendimiento. Cuando una consulta específica con tablas estándar funciona mal, Dataverse podría realizar automáticamente cambios que mejoran el rendimiento de la consulta. Este comportamiento puede hacer que ciertos problemas de rendimiento aparezcan transitorios porque no se pueden reproducir más adelante.

La optimización automática de consultas no requiere ninguna configuración. Está habilitado de forma predeterminada para todos los usuarios.

Consulte también

Consultar datos usando QueryExpression
Seleccionar columnas usando QueryExpression
Unir tablas usando QueryExpression
Ordenar filas usando QueryExpression
Filtrar filas usando QueryExpression
Resultados de la página usando QueryExpression
Agregar datos usando QueryExpression
Contar filas usando QueryExpression
Antipatrones de consulta