Existen algunas diferencias entre las tablas temporales (#tmp) y las variables de tabla (@tmp), aunque el uso de tempdb no es una de ellas, como se explica en el enlace de MSDN a continuación.
Como regla general, para volúmenes de datos pequeños a medianos y escenarios de uso simple, debe usar variables de tabla. (Esta es una guía demasiado amplia con, por supuesto, muchas excepciones; consulte a continuación y los siguientes artículos).
Algunos puntos a considerar al elegir entre ellos:
-
Las tablas temporales son tablas reales, por lo que puede hacer cosas como CREAR ÍNDICES, etc. Si tiene grandes cantidades de datos para los cuales el acceso por índice será más rápido, las tablas temporales son una buena opción.
-
Las variables de tabla pueden tener índices mediante el uso de restricciones PRIMARY KEY o UNIQUE. (Si desea un índice no único, simplemente incluya la columna de clave principal como la última columna en la restricción única. Si no tiene una columna única, puede usar una columna de identidad). SQL 2014 también tiene índices no únicos .
-
Las variables de tabla no participan en transacciones y
SELECT
s están implícitamente conNOLOCK
. El comportamiento de la transacción puede ser muy útil, por ejemplo, si desea RETROCEDER a la mitad de un procedimiento, ¡las variables de la tabla completadas durante esa transacción seguirán completadas! -
Las tablas temporales pueden hacer que los procedimientos almacenados se vuelvan a compilar, quizás con frecuencia. Las variables de tabla no lo harán.
-
Puede crear una tabla temporal usando SELECCIONAR EN, que puede ser más rápido de escribir (bueno para consultas ad-hoc) y puede permitirle lidiar con tipos de datos cambiantes con el tiempo, ya que no necesita definir su estructura de tabla temporal por adelantado.
-
Puede devolver variables de tabla desde funciones, lo que le permite encapsular y reutilizar la lógica mucho más fácilmente (por ejemplo, crear una función para dividir una cadena en una tabla de valores en algún delimitador arbitrario).
-
El uso de variables de tabla dentro de funciones definidas por el usuario permite que esas funciones se usen más ampliamente (consulte la documentación CREATE FUNCTION para obtener más detalles). Si está escribiendo una función, debe usar variables de tabla en lugar de tablas temporales, a menos que exista una necesidad imperiosa de lo contrario.
-
Tanto las variables de tabla como las tablas temporales se almacenan en tempdb. Pero las variables de la tabla (desde 2005) utilizan de forma predeterminada la intercalación de la base de datos actual frente a las tablas temporales que toman la intercalación predeterminada de tempdb (ref). Esto significa que debe tener en cuenta los problemas de intercalación si usa tablas temporales y la intercalación de su base de datos es diferente a la de tempdb, lo que causa problemas si desea comparar datos en la tabla temporal con datos en su base de datos.
-
Las tablas temporales globales (##tmp) son otro tipo de tabla temporal disponible para todas las sesiones y usuarios.
Algunas lecturas adicionales:
-
La gran respuesta de Martin Smith en dba.stackexchange.com
-
Preguntas frecuentes de MSDN sobre la diferencia entre los dos:https://support.microsoft.com/en-gb/kb/305977
-
Artículo de blog de MDSN:https://docs.microsoft.com/archive/blogs/sqlserverstorageengine/tempdb-table-variable-vs-local-temporary-table
-
Artículo:https://searchsqlserver.techtarget.com/tip/Temporary-tables-in-SQL-Server-vs-table-variables
-
Comportamientos inesperados e implicaciones de rendimiento de tablas temporales y variables temporales:Paul White en SQLblog.com