Antipatrones de consulta
Redactar consultas optimizadas para Dataverse es vital para garantizar que las aplicaciones ofrezcan una experiencia rápida, receptiva y fiable. Obtenga información sobre los patrones que se deben evitar al redactar consultas para tablas estándar mediante el mensaje RetrieveMultiple
o mensajes que tienen un parámetro que hereda de la clase QueryBase.
Esta guía también se aplica al enviar una solicitud de GET
contra una colección de registros mediante OData.
Nota
Es posible que las instrucciones aquí no se apliquen a tablas elásticas o cuando se utiliza la búsqueda de Dataverse.
Minimice el número de columnas seleccionadas
No incluya columnas que no necesite en su consulta. Las consultas que devuelven todas las columnas o incluyen una gran cantidad de columnas pueden encontrar problemas de rendimiento debido al tamaño de conjunto de datos o la complejidad de la consulta.
Minimizar el número de columnas lógicas seleccionadas
Debe evitar solicitar demasiadas columnas, especialmente las lógicas. Una columna lógica contiene valores que se almacenan en diferentes tablas de bases de datos. La propiedad AttributeMetadata.IsLogical le indica si una columna es una columna lógica. Las consultas que contienen muchas columnas lógicas son más lentas porque Dataverse necesita combinar los datos de otras tablas de bases de datos.
Evite los comodines iniciales en condiciones de filtro
Las consultas que utilizan condiciones con comodines iniciales (ya sea explícita o implícitamente con un operador como ends-with
) pueden provocar un mal rendimiento. Dataverse no puede aprovechar los índices de la base de datos cuando una consulta utiliza comodines iniciales, lo que obliga a SQL a escanear toda la tabla. Los recorridos de tabla pueden producirse incluso si hay otras consultas comodín no principales que limitan el conjunto de resultados.
El siguiente ejemplo es un elemento de condición FetchXml que utiliza un comodín inicial:
<condition attribute='accountnumber'
operator='like'
value='%234' />
Cuando se agota el tiempo de espera de las consultas y se detecta este patrón, Dataverse devuelve un error único para ayudar a identificar qué consultas utilizan este patrón:
Nombre:
LeadingWildcardCauseTimeout
Código:0x80048573
Número:-2147187341
Mensaje: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 limita con fuerza las consultas que utilizan anti-patrones de consulta conocidos cuando se identifican como un riesgo para el estado del entorno para ayudar a prevenir interrupciones. Cuando se produce un error en una consulta debido a la limitación y se detecta este patrón, Dataverse devuelve un error único:
Nombre:
DataEngineLeadingWildcardQueryThrottling
Código:0x80048644
Número:-2147187132
Mensaje: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 utiliza consultas con comodines principales, investigue estas opciones:
- Use en su lugar la búsqueda de Dataverse.
- Cambie su modelo de datos para ayudar a las personas a evitar la necesidad de comodines principales.
Otros caracteres comodín
Como se describe en Usar caracteres comodín en condiciones para valores de cadena, otros caracteres distintos del signo de porcentaje (%) pueden actuar como comodín. A continuación se muestran dos cadenas de consulta de ejemplo que también se comportan como comodines iniciales:
_234%
[^a]234%
Dataverse limita en gran medida las consultas con cadenas de búsqueda que comienzan con estos otros caracteres especiales comodín iniciales.
Carácter guión
Las reglas de ordenación Unicode de intercalación de bases de datos hacen que algunas cadenas de búsqueda que comienzan con un guión ('-') funcionen como búsquedas con comodines iniciales. Las cadenas de búsqueda que comienzan con un guión no pueden aprovechar los índices de base de datos si la cadena de búsqueda no contiene un carácter que no sea comodín antes de que aparezca el carácter "%" en la cadena. Por ejemplo, -%
y -%234
no puede usar de manera eficiente los índices de la base de datos, mientras que -234%
sí puede. Dataverse limita considerablemente las cadenas de búsqueda ineficaces que comienzan con guiones. Para obtener más información sobre las reglas de ordenación Unicode de la intercalación de bases de datos para guiones, consulte Intercalaciones de SQL Server.
Evite el uso de fórmulas o columnas calculadas en condiciones de filtro
Los valores de fórmula y columnas calculadas se calculan en tiempo real cuando se recuperan. Las consultas que utilizan filtros en estas columnas obligan a Dataverse a calcular el valor de cada registro posible que se puede devolver para que se pueda aplicar el filtro. Las consultas son más lentas porque Dataverse no se puede mejorar el rendimiento de estas consultas usando SQL.
Cuando se agota el tiempo de espera de las consultas y se detecta este patrón, Dataverse devuelve un error único para ayudar a identificar qué consultas utilizan este patrón:
Nombre:
ComputedColumnCauseTimeout
Código:0x80048574
Número:-2147187340
Mensaje: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 limita con fuerza las consultas que tienen filtros en columnas calculadas que se identifican como un riesgo para la salud del medio ambiente para ayudar a prevenir interrupciones. Cuando se produce un error en una consulta debido a la limitación y se detecta este patrón, Dataverse devuelve un error único:
Nombre:
DataEngineComputedColumnQueryThrottling
Código:0x80048744
Número:-2147186876
Mensaje: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.
Evite ordenar por columnas de elección
Cuando se utiliza FetchXml o QueryExpression, al ordenar los resultados de la consulta utilizando una columna elegida, los resultados se ordenan utilizando la etiqueta localizada para cada opción. Ordenar por el valor numérico almacenado en la base de datos no proporcionaría una buena experiencia en su aplicación. Debe saber que ordenar columnas de elección requiere más recursos informáticos para unir y ordenar las filas por el valor de etiqueta localizado. Este trabajo adicional hace que la consulta sea más lenta. Si es posible, intente evitar ordenar los resultados por valores de columna de elección.
Nota
OData es diferente. Con la API web Dataverse, $orderby
ordena las filas utilizando el valor entero de la columna de elección en lugar de la etiqueta localizada.
Evite ordenar por columnas en tablas relacionadas
Ordenar por columnas en tablas relacionadas hace que la consulta sea más lenta debido a la complejidad adicional.
El pedido por tablas relacionadas solo debe realizarse cuando sea necesario, como se describe aquí:
Evite el uso de condiciones en columnas de texto grandes
Dataverse tiene dos tipos de columnas que pueden almacenar grandes cadenas de texto:
- StringAttributeMetada puede almacenar hasta de 4000 caracteres.
- MemoAttributeMetadata puede almacenar un número mayor.
El límite para ambas columnas se especifica mediante la propiedad MaxLength
.
Puede utilizar condiciones en columnas de cadena que tengan un MaxLength
configurado para menos de 850 caracteres.
Todas las columnas de notas o columnas de cadena con un MaxLength
mayor que 850 se definen en Dataverse como columnas de texto grandes. Las columnas de texto grandes son demasiado grandes para indexarlas de manera efectiva, lo que genera un mal rendimiento cuando se incluyen en una condición de filtro.
La búsqueda Dataverse una mejor opción para consultar datos en este tipo de columnas.
Error de Dataverse de tiempos de espera de consulta causado por antipatrones
Cuando se agota el tiempo de espera de una consulta y esta usa uno de los antipatrones detallados en esta página, Dataverse devuelve el siguiente error único para ayudar a identificar qué antipatrones está usando la consulta:
Nombre:
PerformanceValidationIssuesCauseTimeout
Código:0x80048575
Número:-2147187339
Mensaje: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 parte {0}
del mensaje de excepción contiene el antipatrón que usa la consulta. Si la consulta usa varios antipatrones, se separan por comas. Por ejemplo, si una consulta se filtra en una columna de texto grande y también selecciona un gran número de columnas, el mensaje de excepción contiene la cadena PerformanceLargeColumnSearch,LargeAmountOfAttributes
. En la tabla siguiente se enumeran los antipatrones con vínculos a explicaciones:
Identificador antipatrón | Vínculo de la explicación |
---|---|
PerformanceLeadingWildCard |
Evite los comodines iniciales en condiciones de filtro |
PerformanceLargeColumnSearch |
Evite el uso de condiciones en columnas de texto grandes |
OrderOnEnumAttribute |
Evite ordenar por columnas de elección |
OrderOnPropertiesFromJoinedTables |
Evite ordenar por columnas en tablas relacionadas |
LargeAmountOfAttributes |
Minimice el número de columnas seleccionadas |
LargeAmountOfLogicalAttributes |
Minimizar el número de columnas lógicas seleccionadas |
FilteringOnCalculatedColumns |
Evite el uso de fórmulas o columnas calculadas en condiciones de filtro |
Use las instrucciones de esta página para comprender los antipatrones y modificar la consulta para evitar el uso de estos antipatrones.
Nota
Si una consulta contiene el antipatrón PerformanceLeadingWildCard
o el antipatrón FilteringOnCalculatedColumns
, se genera un error de Dataverse diferente. Las consultas que usan el antipatrón PerformanceLeadingWildCard
arrojan el error LeadingWildcardCauseTimeout
mencionado en esta página, y las consultas que usan el antipatrón FilteringOnCalculatedColumns
arrojan el error ComputedColumnCauseTimeout
mencionado en esta página.
Los errores LeadingWildcardCauseTimeout
y ComputedColumnCauseTimeout
son anteriores al error PerformanceValidationIssuesCauseTimeout
; los errores LeadingWildcardCauseTimeout
y ComputedColumnCauseTimeout
se siguen lanzando para mantener la compatibilidad con versiones anteriores.
Artículos relacionados
Limitación de consultas
Usar caracteres comodín en condiciones para valores de cadena
Consultar datos mediante FetchXML
Consultar datos usando QueryExpression
Usar OData para consultar datos