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'.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top