Para CTE o no al CTE
-
26-09-2019 - |
Pregunta
Después de haber sido pegado con SQL2000 durante demasiado tiempo, Realmente no he tenido mucha exposición a expresiones de tabla comunes.
Las respuestas que he dado aquí (# 4025380) y aquí (# 4018793) han ido en contra de la corriente en que no hizo uso de un CTE.
Soy consciente de que para la recursividad son Beez kneez, y hay un par de consultas que se pueden simplificar en gran medida por su uso, pero en qué momento es su uso simplemente frívola? ¿Tienen una gran mejora en el rendimiento sobre una sub consulta o una unen? Hacer que el código realmente simplificar y hacer que sea más fácil de mantener?
En resumen, cuando es una buena práctica usar un CTE más de una sintaxis 'menor'.
Solución
Se debe utilizar generalmente un CTE más de una sub consulta normal si:
- Su consulta requiere la repetición (como usted señaló)
- La subconsulta es grande o complejo
- La consulta que contiene es grande o complejo
- La subconsulta se repite (o al menos varias subconsultas se puede simplificar mediante la realización de diferentes operaciones simples en una subconsulta común)
En resumen, sí lo hacen las consultas de creación más legible cuando bien utilizado.
Otros consejos
En lo personal, una vez que llegué cómodo usando ellos, creo que producen más limpio, más legible el código. A modo de ejemplo, compare su respuesta a la mía en # 4018793 . Nos hicimos esencialmente la misma cosa; He utilizado un CTE y que no lo hizo.
Su respuesta sin CTE:
SELECT
course,
section,
grade,
gradeCount
FROM
table
INNER JOIN
(SELECT
grade,
Max(gradeCount) as MaxGradeCount
FROM
table
) MaxGrades
ON table.grade = MaxGrades.grade
AND table.gradeCount = MaxGrades.MaxGradeCount
ORDER BY
table.grade
Mi respuesta con CTE:
;with cteMaxGradeCount as (
select
grade,
max(gradeCount) as MaxGradeCount
from @Test
group by grade
)
select
t.course,
t.SECTION,
t.grade,
t.gradeCount
from cteMaxGradeCount c
inner join @Test t
on c.grade = t.grade
and c.MaxGradeCount = t.gradeCount
order by t.grade
Son azúcar sintáctico, con la excepción de consultas jerárquicas / recursivas.
Sin embargo, no todo lo que se puede hacer de forma recursiva debe ser - a través de la generación de la fecha CTE recursiva era apenas mejor que un cursor -. El truco tabla de números escala mucho mejor
CTE produce un resultado más rápido en un escenario recursiva. El resultado de CTE se usa repetidamente para obtener el conjunto de resultados final. Por lo que se han quitado la cláusula WHERE o subconsulta en CTE, sin duda se va a mostrar la mejora del rendimiento.
Referencia: http://msdn.microsoft.com/ en-us / library / ms190766 (v = sql.105) .aspx
Sólo una nota, en muchos escenarios, tablas temporales da un mejor rendimiento luego CTE también, por lo que debería darle una oportunidad a tablas temporales también.
Referencia: http: //social.msdn .microsoft.com / Foros / en / Transact-SQL / hilo / d040d19d-016E-4a21-bf44-a0359fb3c7fb