He escrito una UDF con valores de tabla que comienza por un CTE para devolver un subconjunto de las filas de una tabla grande. Hay varias combinaciones en la CTE. Un par de combinaciones internas y una izquierda se unen a otras tablas, que no contienen muchas filas. El CTE tiene una cláusula where que devuelve las filas dentro de un intervalo de fechas, con el fin de devolver sólo las filas necesarias.SQL Server CTE hace referencia en el mismo se une lenta
Estoy haciendo referencia a este CTE en 4 uniones a la izquierda, para construir subtotales con diferentes criterios.
La consulta es bastante complejo, pero aquí es un pseudo-versión simplificada de la misma
WITH DataCTE as
(
SELECT [columns] FROM table
INNER JOIN table2
ON [...]
INNER JOIN table3
ON [...]
LEFT JOIN table3
ON [...]
)
SELECT [aggregates_columns of each subset] FROM DataCTE Main
LEFT JOIN DataCTE BananasSubset
ON [...]
AND Product = 'Bananas'
AND Quality = 100
LEFT JOIN DataCTE DamagedBananasSubset
ON [...]
AND Product = 'Bananas'
AND Quality < 20
LEFT JOIN DataCTE MangosSubset
ON [...]
GROUP BY [
tengo la sensación de que SQL Server se confunde y llama a la CTE para cada auto unirse, que parece confirmada por mirar el plan de ejecución, aunque confieso que no soy un experto en leer esos.
Supongo que SQL Server es lo suficientemente inteligente como para realizar solo la recuperación de datos desde el CTE solo una vez, en lugar de hacerlo varias veces.
He intentado el mismo enfoque pero en lugar de usar un CTE para obtener el subconjunto de los datos, utilicé la misma consulta de selección que en el CTE, pero hice que fuera una tabla temporal en su lugar.
La versión en referencia la versión CTE tarda 40 segundos. La versión que hace referencia a la tabla temporal toma entre 1 y 2 segundos.
¿Por qué no es SQL Server lo suficientemente inteligente como para mantener los resultados de CTE en la memoria?
Me gustan los CTE, especialmente en este caso ya que mi UDF es una tabla de valor, por lo que me permitió mantener todo en una sola declaración.
Para usar una tabla temporal, necesitaría escribir una UDF con una tabla multi-declaración, que me parece una solución un poco menos elegante.
¿Alguno de ustedes tuvo este tipo de problemas de rendimiento con CTE y, de ser así, cómo los ordenó?
Gracias,
Kharlos
¿Puede publicar su plan de ejecución? –