EDITAR:
Por favor, vea los comentarios de Martin a continuación:
El CTE no se materializa como una tabla en la memoria. Es solo una forma de encapsular una definición de consulta. En el caso del OP, estará en línea y será lo mismo que hacer SELECT Column1, Column2, Column3 FROM SomeTable
. La mayoría de las veces no se materializan por adelantado, por lo que esto no devuelve filas WITH T(X) AS (SELECT NEWID())SELECT * FROM T T1 JOIN T T2 ON T1.X=T2.X
, también verifique los planes de ejecución. Aunque a veces es posible hackear el plan para obtener un carrete. Hay un elemento de conexión que solicita una pista para esto. - Martin Smith 15 de febrero de 12 a las 17:08
Respuesta original
CTE
Leer más en MSDN
Un CTE crea la tabla que se usa en la memoria, pero solo es válida para la consulta específica que le sigue. Cuando se utiliza la recursividad, esta puede ser una estructura efectiva.
También es posible que desee considerar el uso de una variable de tabla. Esto se usa como una tabla temporal y se puede usar varias veces sin necesidad de volver a materializarse para cada unión. Además, si necesita conservar algunos registros ahora, agregue algunos registros más después de la siguiente selección, agregue algunos registros más después de otra operación, luego devuelva esos pocos registros, entonces esta puede ser una estructura práctica, ya que no No es necesario dejarlo caer después de la ejecución. Principalmente solo azúcar sintáctico. Sin embargo, si mantiene bajo el recuento de filas, nunca se materializa en el disco. Consulte ¿Cuál es la diferencia entre una tabla temporal y una variable de tabla en SQL Server? para más detalles.
Tabla de temperatura
Lea más en MSDN: desplácese hacia abajo aproximadamente el 40% del camino
Una tabla temporal es literalmente una tabla creada en el disco, solo en una base de datos específica que todos saben que se puede eliminar. Es responsabilidad de un buen desarrollador destruir esas tablas cuando ya no son necesarias, pero un DBA también puede borrarlas.
Las tablas temporales vienen en dos variedades: local y global. En términos de MS Sql Server, utiliza una #tableName
designación para local y una ##tableName
designación para global (tenga en cuenta el uso de un solo o doble # como característica de identificación).
Tenga en cuenta que con las tablas temporales, a diferencia de las variables de tabla o CTE, puede aplicar índices y similares, ya que estas son legítimamente tablas en el sentido normal de la palabra.
En general, usaría tablas temporales para consultas más largas o más grandes, y CTE o variables de tabla si ya tuviera un conjunto de datos pequeño y quisiera escribir rápidamente un poco de código para algo pequeño. La experiencia y los consejos de otros indican que debe usar CTE donde tiene un pequeño número de filas devueltas. Si tiene un gran número, probablemente se beneficiaría de la capacidad de indexar en la tabla temporal.