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
No lock
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 deunion
no está en el filtro de nivel superior, Dataverse transforma la consulta y mueve el filtro con una sugerencia deunion
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";
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