Limitación de consultas
Si una consulta específica crea una carga desproporcionada en la base de datos que almacena datos de Microsoft Dataverse, puede privar de recursos a la base de datos y afectar negativamente el rendimiento de todas las operaciones de datos. Cuando esto pasa, Dataverse puede comenzar a limitar esa consulta en particular, lo que permitiría que todos los demás escenarios funcionen normalmente.
La forma principal en la que limitación de consultas es diferente de Límites de la API de protección de servicios es que limitación de consultas se dirige a una consulta específica que provoca una degradación del rendimiento y no afecta al resto del tráfico. Si la consulta limitada se origina en una aplicación no interactiva, es probable que los usuarios finales no noten la limitación. Si la consulta se origina en una aplicación interactiva afecta a los usuarios que ejercen ese escenario en particular.
Comportamiento de limitación de consultas
La limitación puede manifestarse de tres formas:
- Se introduce un retraso antes de cada ejecución de la consulta, lo que hace que el escenario que la usa sea más lento
- Alguna fracción de los intentos de ejecutar la consulta fallan con cualquiera de los siguientes errores:
Código de error Código hexadecimal |
Nombre. | Publicación |
---|---|---|
-2147187388 0x80048544 |
DataEngineQueryThrottling |
This query cannot be executed because it conflicts with query throttling. |
-2147187132 0x80048644 |
DataEngineLeadingWildcardQueryThrottling |
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. |
-2147186876 0x80048744 |
DataEngineComputedColumnQueryThrottling |
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. |
-2147186875 0x80048745 |
DataEnginePerformanceValidationIssuesQueryThrottling |
This query cannot be executed because it conflicts with Query Throttling; the query has performance validation issues ({0}), which will cause the query to be throttled more aggressively. |
Error de Dataverse de límites de consulta causado por antipatrones
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 una consulta falla debido a la limitación y está utilizando uno de los antipatrones, Dataverse devuelve el siguiente error único para ayudar a identificar qué antipatrones está utilizando la consulta:
Nombre:
DataEnginePerformanceValidationIssuesQueryThrottling
Código:0x80048745
Número:-2147186875
Mensaje:This query cannot be executed because it conflicts with Query Throttling; the query has performance validation issues ({0}), which will cause the query to be throttled more aggressively. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2162952
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 |
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 DataEngineLeadingWildcardQueryThrottling
mencionado en esta página, y las consultas que usan el antipatrón FilteringOnCalculatedColumns
arrojan el error DataEngineComputedColumnQueryThrottling
mencionado en esta página.
Los errores DataEngineLeadingWildcardQueryThrottling
y DataEngineComputedColumnQueryThrottling
son anteriores al error DataEnginePerformanceValidationIssuesQueryThrottling
; los errores DataEngineLeadingWildcardQueryThrottling
y DataEngineComputedColumnQueryThrottling
se siguen lanzando para mantener la compatibilidad con versiones anteriores.
Causas comunes
La mayoría de las situaciones en las que es necesaria la limitación de consultas se incluyen en una de estas dos categorías generales:
Alguna consulta en un escenario interactivo común es ineficaz y requiere una gran cantidad de recursos de base de datos para cada ejecución
- Ejemplos comunes son una consulta guardada utilizada en una cuadrícula o una consulta ejecutada por un complemento
Una operación automatizada ejecuta una consulta a una velocidad elevada que consume una gran cantidad de recursos de base de datos en conjunto, incluso si cada ejecución es menos costosa
- Un ejemplo común es la integración de datos que mueve una gran cantidad de datos dentro o fuera de Dataverse
Cómo evitar la limitación de consultas
La limitación de consultas depende de la consulta y del escenario donde se ejecuta, pero existen algunas pautas comunes:
Para consultas lentas de baja frecuencia, que normalmente se utilizan en aplicaciones interactivas, la estructura de la consulta debe cambiarse para que sea más eficiente
- Algunas pautas comunes para mejorar el rendimiento de las consultas se pueden encontrar en Optimizar el rendimiento mediante FetchXML
Para aplicaciones no interactivas, las formas comunes de reducir la carga de la base de datos son:
- Si se utiliza ExecuteMultiple (u otro mecanismo de procesamiento por lotes), reduzca el tamaño del lote
- Si la aplicación es multihilo, reduzca el número de hilos simultáneos
- Si no está utilizando lotes o peticiones concurrentes, agregue un retardo entre peticiones para reducir la tasa de peticiones
Consulte también
Antipatrones de consulta
Optimizar el rendimiento mediante FetchXml
Optimizar el rendimiento utilizando QueryExpression
Límites de la API de protección de servicio