maxrecursion - sql server table with
¿Cuáles son las principales diferencias entre las tablas CTE y TEMP? (2)
Probablemente la mayor diferencia entre un CTE y una tabla temporal, es que el CTE tiene un alcance de ejecución de una sola instrucción SELECT, INSERT, UPDATE, DELETE o CREATE VIEW.
Esencialmente, no puede reutilizar el CTE, como puede hacerlo con las tablas temporales.
De la documentation
Una expresión de tabla común (CTE) se puede considerar como un conjunto de resultados temporal que se define dentro del alcance de ejecución de una sola instrucción SELECT, INSERT, UPDATE, DELETE o CREATE VIEW. Un CTE es similar a una tabla derivada en que no se almacena como un objeto y dura solo la duración de la consulta. A diferencia de una tabla derivada, un CTE puede ser auto-referenciado y puede ser referenciado varias veces en la misma consulta.
Un CTE se puede utilizar para:
Crear una consulta recursiva. Para obtener más información, consulte Consultas recursivas mediante expresiones de tabla comunes.
Sustituya una vista cuando no se requiera el uso general de una vista; es decir, no es necesario almacenar la definición en metadatos.
Habilite la agrupación por una columna que se deriva de una subselección escalar, o una función que no es determinista o tiene acceso externo.
Haga referencia a la tabla resultante varias veces en la misma declaración.
¿Existe algún beneficio al usar CTE''s
( common table expressions
) en lugar de usar temp tables
?
Pasé por pruebas de rendimiento entre ambos, pero no puedo encontrar mucha diferencia entre ellos.
¿Cuáles son algunas ventajas y desventajas de usar CTE''S
?
CTE: CTE significa expresiones de tabla comunes. Se introdujo con SQL Server 2005. Se utiliza para almacenar el resultado de una subconsulta compleja en bases temporales. Su vida se limita a la consulta actual. Se define utilizando la sentencia WITH. Se utiliza principalmente para la llamada recursiva.
Ejemplo
;with myCTE as
(
select ParentLevel, ParentID, ChildID
from MHA
where ChildID = 1
UNION ALL
select MHA.ParentLevel, MHA.ParentID, MHA.ChildID
from MHA
inner join myCTE on MHA.ParentID = myCTE.ChildID
where MHA.ParentID <> 0
)
(error)
select top (5) * from myCTE
así que en el ejemplo anterior, he creado el nombre CTE como myCTE, que solo se puede usar en la consulta anterior (no puedo usar myCTE al margen de la consulta anterior)
TEMP: También se usa para almacenar el resultado de la consulta en bases temporales. Pero su vida está limitada a la sesión actual. Se define utilizando #. No soporta recursivo.
Ejemplo:
select * into #tempTable from MHA
En la consulta anterior, he creado la tabla temporal, ahora puedo usarla fuera de esta consulta pero en sesión. Vea abajo
(No hay error)
select top (5) * from #tempTable