sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo puedo forzar que una subconsulta funcione tan bien como una tabla #temp?

Hay algunas explicaciones posibles de por qué ve este comportamiento. Algunos comunes son

  1. Es posible que la subconsulta o CTE se esté reevaluando repetidamente.
  2. Materialización de resultados parciales en un #temp table puede forzar un orden de combinación más óptimo para esa parte del plan al eliminar algunas opciones posibles de la ecuación.
  3. Materialización de resultados parciales en un #temp table puede mejorar el resto del plan al corregir las estimaciones de cardinalidad deficientes.

El método más confiable es simplemente usar un #temp mesa y materialízalo tú mismo.

De lo contrario, con respecto al punto 1, consulte Proporcionar una pista para forzar la materialización intermedia de CTE o tablas derivadas . El uso de TOP(large_number) ... ORDER BY a menudo puede animar a que el resultado se ponga en cola en lugar de reevaluarlo repetidamente.

Incluso si eso funciona, no hay estadísticas en el spool.

Para los puntos 2 y 3 necesitarías analizar por qué no estabas obteniendo el plan deseado. Posiblemente, reescribir la consulta para usar predicados sargable o actualizar las estadísticas podría obtener un mejor plan. De lo contrario, puede intentar usar sugerencias de consulta para obtener el plan deseado.