La suposición de contención de combinación en el Nuevo estimador de cardinalidad degrada el rendimiento de las consultas
Este artículo le ayuda a resolver problemas de rendimiento que pueden producirse en SQL Server 2014 y versiones posteriores al compilar las consultas mediante el nuevo estimador de cardinalidad.
Versión del producto original: SQL Server
Número de KB original: 3189675
Síntomas
Imagine la siguiente situación:
- Usa SQL Server 2014 o una versión posterior.
- Ejecute una consulta que contenga combinaciones y predicados de filtro que no sean de combinación.
- La consulta se compila mediante la nueva estimación de cardinalidad (SQL Server) (nueva CE).
En este escenario, experimentará una degradación del rendimiento de las consultas.
Este problema no se produce si compila la consulta mediante la CE heredada.
Causa
A partir de SQL Server 2014, se introdujo el Nuevo Estimador de Cardinalidad (Nueva CE) para el nivel de compatibilidad de base de datos 120 y posterior. La nueva CE cambia varias suposiciones de la CE heredada en el modelo que usa el optimizador de consultas cuando calcula la cardinalidad de los distintos operadores y predicados.
Uno de estos cambios está relacionado con la suposición de contención de unión.
El modelo ce heredado supone que los usuarios siempre consultan los datos que existen. Esto significa que, para un predicado de combinación que implica una operación de unión equidistante para dos tablas, las columnas unidas existen a ambos lados de la combinación. En presencia de predicados de filtro adicionales que no son de combinación en la tabla de combinación, la CE heredada asume algún nivel de correlación para los predicados de combinación y los predicados de filtro que no son de combinación. Esta correlación implícita se denomina Contención simple.
Como alternativa, la nueva CE usa la contención base como correlación. El nuevo modelo de CE supone que los usuarios pueden consultar datos que no existen. Esto significa que es posible que los predicados de filtro de tablas independientes no estén correlacionados entre sí. Por lo tanto, usamos un enfoque probabilístico.
Para muchos escenarios prácticos, el uso de la suposición de contención base crea mejores estimaciones. Esto, a su vez, crea opciones de plan de consulta más eficaces. Sin embargo, en algunas situaciones, el uso de la suposición simple de contención puede proporcionar mejores resultados. Si esto ocurre, puede experimentar una elección de plan de consulta menos eficaz cuando use la nueva CE en lugar de la CE heredada.
Para obtener más información sobre cómo solucionar problemas relacionados con New CE, consulte Disminución del rendimiento de las consultas después de la actualización de SQL Server 2012 o anterior a 2014 o posterior.
Solución
En SQL Server 2014 y versiones posteriores, puede usar la marca de seguimiento 9476 para forzar a SQL Server a usar la suposición simple de contención en lugar de la suposición de contención base predeterminada. Si puede modificar la consulta de aplicación, la mejor opción es usar la sugerencia ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS
de consulta después de SQL Server 2016 (13.x) SP1. Para obtener más información, vea USE HINT. Por ejemplo:
SELECT * FROM Table1 t1
JOIN Table2 t2
ON t1.Col1 = t2.Col1
WHERE Col1 = 10
OPTION (USE HINT ('ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'));
Habilitar esta marca de seguimiento o usar la sugerencia de consulta puede mejorar la elección del plan de consulta sin tener que revertir completamente al modelo ce heredado si se cumplen las condiciones siguientes:
- Experimenta una elección de plan de consulta poco óptimo que provoca un rendimiento general degradado para las consultas que contienen combinaciones y predicados de filtro que no son de combinación.
- Puede comprobar una imprecisión significativa en una estimación de "cardinalidad de combinación" (es decir, el número real frente al estimado de filas que difieren significativamente).
- Esta imprecisión no existe cuando se compilan consultas mediante la CE heredada.
Puede habilitar esta marca de seguimiento globalmente, en el nivel de sesión o en el nivel de consulta.
Nota:
El uso incorrecto de marcas de seguimiento puede degradar el rendimiento de la carga de trabajo. Para obtener más información, vea Sugerencias (Transact-SQL): consulta.