sql-server performance common-table-expression maintainability

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.