26

Habiendo estado atrapado con SQL2000 durante demasiado tiempo, realmente no he tenido mucha exposición a Common Table Expressions.Para CTE o no para CTE

Las respuestas que he dado here (#4025380) y here (#4018793) han ido en contra del flujo en el sentido de que no usaban un CTE.

Agradezco que, para la recursividad, sean beez kneez, y hay algunas consultas que se pueden simplificar enormemente con su uso, pero ¿en qué punto 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"?

+0

Mismo beneficio que con muchos otros paradigmas de programación: divide y conquista. Eche un vistazo al sitio de datos. Algunas personas hacen buen uso de los CTE para que las consultas sean mucho más legibles. p.ej. http://odata.stackexchange.com/stackoverflow/s/299/how-long-until-i-get-the-generalist-badge – Jacob

+0

@Jacob que vale la pena ser una respuesta adecuada. –

+1

Solo una actualización, ahora uso CTE mucho. Ser capaz de dividir un proceso en pasos más pequeños hace que una consulta compleja sea mucho más fácil de leer.Guarda anidar el código dentro de la sentencia SQL final o tener que crear y referenciar vistas externas. –

Respuesta

21

En general, usted debe usar 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 compleja
  • 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í hacen que las consultas sean más legibles cuando se usan bien.

+0

A pesar de no obtener ningún voto, esta respuesta resume los puntos planteados en las otras respuestas, por lo que recibe el tic :-) –

3

Son azúcar sintáctica, 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 fecha mediante CTE recursivo apenas fue mejor que un cursor - el truco de la tabla NUMBERS escalado mucho mejor.

+0

No puedo encontrar la respuesta de Emtucifor que muestra la diferencia entre varios enfoques para generar listas :( –

+0

Exactamente mi Sin embargo, no todo debería usar CTE, recursivo o de otro tipo. Tal vez un buen ejercicio sería escribir la solución de ambas maneras para que se pueda medir el rendimiento y evaluar la legibilidad. –

+0

@webturner: La respuesta de Emtucifor hizo exactamente eso, para la generación del rango de fechas. Además, los CTE no se materializan; pueden estar en Oracle 10g +. –

18

Personalmente, una vez que me sentí cómodo usándolos, creo que producen un código más limpio y legible. Como ejemplo, compare su respuesta a la mía en #4018793. Nosotros esencialmente 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 
+5

+1 solo teniendo estos dos ejemplos uno al lado del otro me ha dado una gran cantidad de información en CTEs –

2

CTE se obtiene un resultado más rápido en un escenario recursiva. El resultado de CTE se usa repetidamente para obtener el resultado final. Entonces, 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

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/Forums/en/transactsql/thread/d040d19d-016e-4a21-bf44-a0359fb3c7fb

Cuestiones relacionadas