De esta publicación ¿Cómo usar ROW_NUMBER en el siguiente procedimiento?
Hay dos versiones de respuestas donde una usa ay sub-query
la otra usa a CTE
para resolver el mismo problema.
Ahora bien, ¿cuál es la ventaja de usar un CTE (Common Table Expression)
sobre una 'subconsulta' (por lo tanto, es más legible lo que la consulta realmente está haciendo)
La única ventaja de usar un CTE
over sub-select
es que realmente puedo nombrar el sub-query
. ¿Hay alguna otra diferencia entre esos dos cuando se usa un CTE como un CTE simple (no recursivo)?
sql
sql-server
tsql
subquery
common-table-expression
dance2die
fuente
fuente
Respuestas:
En las versiones CTE de subconsulta versus versiones simples (no recursivas), probablemente sean muy similares. Tendría que usar el generador de perfiles y el plan de ejecución real para detectar cualquier diferencia, y eso sería específico para su configuración (por lo que no podemos decirle la respuesta completa).
En general ; Un CTE puede usarse recursivamente; una subconsulta no puede Esto los hace especialmente adecuados para estructuras de árboles.
fuente
A CTE can be used recursively; a sub-query cannot
. Un ejemplo hubiera sido genial.La principal ventaja de la expresión de tabla común (cuando no se usa para consultas recursivas ) es la encapsulación, en lugar de tener que declarar la subconsulta en cada lugar donde desee usarla, puede definirla una vez, pero tiene múltiples referencias lo.
Sin embargo, esto no significa que se ejecute solo una vez (según las iteraciones anteriores de esta misma respuesta , gracias a todos los que han comentado). La consulta definitivamente tiene el potencial de ejecutarse varias veces si se hace referencia a ella varias veces; el optimizador de consultas finalmente toma la decisión de cómo se debe interpretar el CTE.
fuente
CTE
Los más útiles para la recursividad:devolverá
@n
filas (hasta101
). Útil para calendarios, conjuntos de filas ficticias, etc.También son más legibles (en mi opinión).
Aparte de esto,
CTE
'S ysubqueries
son idénticos.fuente
;WITH blabla AS ...)
WITH
,MERGE
y similaresUna diferencia que no se ha mencionado es que se puede hacer referencia a un solo CTE en varias partes de un sindicato
fuente
A menos que me falte algo, puede nombrar CTE y subconsultas con la misma facilidad.
Supongo que la principal diferencia es la legibilidad (encuentro que el CTE es más legible porque define su subconsulta por adelantado en lugar de en el medio).
Y si necesita hacer algo con la recursividad, tendrá algunos problemas para hacerlo con una subconsulta;)
fuente
Un hecho importante que nadie ha mencionado es que (al menos en postgres), los CTE son vallas de optimización:
https://blog.2ndquadrant.com/postgresql-ctes-are-optimization-fences/
Es decir, serán tratados como su propia consulta atómica, en lugar de plegarse en todo el plan de consulta. Me falta la experiencia para dar una mejor explicación, pero debe verificar la semántica de la versión de sql que está utilizando; para usuarios avanzados, poder crear una valla de optimización puede ayudar al rendimiento si tiene un nivel experto en el control del planificador de consultas; en el 99% de los casos, sin embargo, debe evitar intentar decirle al planificador de consultas qué hacer, porque lo que cree que será más rápido es probablemente peor de lo que cree que será más rápido. :-)
fuente
Agregando a las respuestas de otros, si tiene una y la misma subconsulta utilizada varias veces, puede reemplazar todas estas subconsultas con un CTE. Esto le permite reutilizar mejor su código.
fuente
Una cosa que debe comprender también es que en versiones anteriores de SQL Server (sí, muchas personas aún necesitan admitir bases de datos SQL Server 2000), los CTE no están permitidos y la tabla derivada es su mejor solución.
fuente
SUGERENCIA: (MAXRECURSION n)
Por ejemplo, podrías probar:
fuente