sql server - A CTE o no a CTE
sql-server performance (4)
CTE produce un resultado más rápido en un escenario recursivo. El resultado de CTE se usa repetidamente para obtener el conjunto de resultados final. Así que, dado que ha tomado su cláusula where o subconsulta en CTE, definitivamente va a mostrar una mejora en el rendimiento.
Referencia: http://msdn.microsoft.com/en-us/library/ms190766(v=sql.105).aspx
Solo una nota, en muchos escenarios, las tablas temporales ofrecen un mejor rendimiento que CTE también, por lo que también debe intentar las tablas temporales.
Referencia: http://social.msdn.microsoft.com/Forums/en/transactsql/thread/d040d19d-016e-4a21-bf44-a0359fb3c7fb
Después de haber estado estancado con SQL2000 durante demasiado tiempo, realmente no he tenido mucha exposición a las Expresiones de tabla comunes.
Las respuestas que he dado aquí (# 4025380) y aquí (# 4018793) han ido en contra del flujo en que no usaron un CTE.
Aprecio que, para la recursión, son los beez kneez, y hay algunas preguntas que pueden simplificarse enormemente por su uso, pero ¿en qué momento su uso es simplemente frívolo? ¿Tienen un gran beneficio de rendimiento sobre una subconsulta o una unión? ¿Realmente simplifican el código y lo hacen más fácil de mantener?
En resumen, ¿cuándo es una buena práctica usar un CTE sobre una sintaxis "menor"?
Personalmente, una vez que me sentí cómodo usándolos, creo que producen un código más limpio y más legible. Como ejemplo, compara tu respuesta con la mía en # 4018793 . Básicamente hicimos lo mismo; Usé un CTE y tú no.
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
Por lo general, debe usar un CTE en una subconsulta normal si:
- Su consulta requiere recursión (como usted anotó)
- La subconsulta es grande o compleja.
- La consulta que contiene es grande o compleja.
- La subconsulta se repite (o al menos varias subconsultas pueden simplificarse realizando diferentes operaciones simples en una subconsulta común)
En resumen, sí, hacen que las consultas sean más legibles cuando se usan bien.
Son azúcares sintácticos, con la excepción de consultas jerárquicas / recursivas.
Sin embargo, no todo lo que se puede hacer recursivamente debe ser: la generación de fechas a través de CTE recursivo fue apenas mejor que un cursor, el truco de la tabla NÚMEROS se mejoró mucho.