Tablas temporales locales y globales en SQL Server

156

¿Cuál es la diferencia entre las tablas temporales locales y globales en SQL Server?

Andrew Sullivan
fuente
2
Aquí hay algunos detalles de resúmenes sobre esto, haga clic aquí
Jayesh Sorathia
55
Tenga cuidado al usar variables de tabla. Si los usa en una consulta, pueden provocar serios problemas de rendimiento con su plan de consulta, ya que no están indexados.
En realidad, las tablas temporales se pueden indexar, si es necesario, pero eso también requiere tiempo y recursos, por lo que aún podría causar problemas de rendimiento o recursos.
Andrew Steitz

Respuestas:

114

Encuentro esta explicación bastante clara (es pura copia de Technet ):

Hay dos tipos de tablas temporales: local y global. Las tablas temporales locales solo son visibles para sus creadores durante la misma conexión a una instancia de SQL Server que cuando las tablas se crearon o referenciaron por primera vez. Las tablas temporales locales se eliminan después de que el usuario se desconecta de la instancia de SQL Server. Las tablas temporales globales son visibles para cualquier usuario y cualquier conexión después de su creación, y se eliminan cuando todos los usuarios que hacen referencia a la tabla se desconectan de la instancia de SQL Server.

Don
fuente
¡Gran respuesta útil! Estaba buscando la información específica sobre si / cuando las tablas temporales globales fueron limpiadas automáticamente por SQL Server.
kwill
Respuesta muy clara y concisa. ¿Alguien puede pensar en un buen caso de uso para tablas temporales globales? ¿Uno que ilustra su propósito en contraste con el propósito de las tablas temporales locales?
Trevor
336
  • Las variables de tabla ( DECLARE @t TABLE) son visibles solo para la conexión que lo crea y se eliminan cuando finaliza el procedimiento por lotes o almacenado.

  • Las tablas temporales locales ( CREATE TABLE #t) son visibles solo para la conexión que la crea y se eliminan cuando se cierra la conexión.

  • Las tablas temporales globales ( CREATE TABLE ##t) son visibles para todos y se eliminan cuando se cierran todas las conexiones a las que se hace referencia.

  • Las tablas permanentes de Tempdb ( USE tempdb CREATE TABLE t) son visibles para todos y se eliminan cuando se reinicia el servidor.

Anthony Faull
fuente
55
También vale la pena señalar: las tablas temporales locales se eliminan cuando se cierra el ámbito que las creó. Entonces, si crea una tabla temporal local dentro de un sproc, y luego intenta acceder a ella fuera de ese sproc, no existirá.
+1 para Will. Intenté utilizar una tabla temporal local como optimizador e intenté utilizar un procedimiento almacenado como inicializador "crear y rellenar si no existe". Como usted dice, no funciona a menos que use una tabla temporal global en su lugar.
Quillbreaker
9
"se eliminan cuando se cierran todas las conexiones a las que se ha hecho referencia": ¿qué significa "que las ha hecho referencia" exactamente? Si un StoredProc de una conexión # 1 crea una ## TempTable, ¿puedo verlo desde otra conexión # 2, digamos 10 minutos más tarde (si esa conexión # 2 estaba activa en el momento de la creación de la tabla?) RESPUESTA: Las tablas temporales globales se eliminan automáticamente cuando la sesión que creó la tabla finaliza y todas las demás tareas han dejado de hacer referencia a ellas. (vea más en esta página en una respuesta diferente)
tbone
Intenté usar un procedimiento almacenado para crear tablas temporales locales (#t) necesarias para la lógica posterior, sin embargo, resultó que el procedimiento almacenado principal tenía que crearlas para que estuvieran disponibles para las llamadas de procedimiento almacenado de los hijos. Esto fue algo triste, porque tenemos un montón de procedimientos almacenados que tienen que configurar las tablas de la misma manera y llamar a sprocs comunes. ¿Las tablas temporales globales funcionarán en este caso donde las llamadas secundarias tienen acceso a las tablas creadas por un hermano? Estamos usando SQL Server 2008.
Brandon
1
@ Brandon Tienes toda la razón. Esa es la falta de funcionalidad. El soporte de TSQL para el alcance adecuado de datos transitorios es bastante incompleto. Es como si los diseñadores de idiomas quisieran que todo fuera global. Y casi no hay soporte para cierres. Podrías pasar una variable de cursor. Pero esa es otra lata de gusanos porque fila por fila agónica no es el camino a seguir.
Anthony Faull
12

1.) Una tabla temporal local existe solo para la duración de una conexión o, si se define dentro de una declaración compuesta, para la duración de la declaración compuesta.

Las tablas temporales locales solo están disponibles para la sesión o conexión de SQL Server (es decir, un solo usuario) que creó las tablas. Estos se eliminan automáticamente cuando la sesión que creó las tablas se ha cerrado. El nombre de la tabla temporal local se observa con un signo de hash único ("#").

CREATE TABLE #LocalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp

El alcance de la tabla temporal local existe para la sesión actual del usuario actual significa para la ventana de consulta actual. Si cierra la ventana de consulta actual o abre una nueva ventana de consulta e intenta encontrar la tabla temporal creada anteriormente, le dará el error.


2.) Una tabla temporal global permanece en la base de datos de forma permanente, pero las filas solo existen dentro de una conexión determinada. Cuando se cierra la conexión, los datos en la tabla temporal global desaparecen. Sin embargo, la definición de la tabla permanece con la base de datos para acceder cuando la base de datos se abra la próxima vez.

Las tablas temporales globales están disponibles para todas las sesiones o conexiones de SQL Server (significa todo el usuario). Estos pueden ser creados por cualquier usuario de conexión de SQL Server y se eliminan automáticamente cuando se han cerrado todas las conexiones de SQL Server. El nombre de la tabla temporal global se observa con el signo de doble hash ("##").

CREATE TABLE ##GlobalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp

Las tablas temporales globales son visibles para todas las conexiones de SQL Server, mientras que las tablas temporales locales son visibles solo para la conexión actual de SQL Server.

Vivek S.
fuente
2
Su definición de una tabla temporal global es cómo esperaría que se comportara (proveniente de otras bases de datos), pero mis pruebas muestran que lo que realmente sucede en SQL Server es: "Las tablas temporales globales se eliminan automáticamente cuando la sesión que creó la tabla finaliza y todas las demás tareas han dejado de hacer referencia a ellos "
Nickolay
11

Citando libros en línea:

Las tablas temporales locales solo son visibles en la sesión actual; Las tablas temporales globales son visibles para todas las sesiones.

Las tablas temporales se eliminan automáticamente cuando salen del alcance, a menos que se eliminen explícitamente usando DROP TABLE:

  • Una tabla temporal local creada en un procedimiento almacenado se descarta automáticamente cuando se completa el procedimiento almacenado. La tabla puede ser referenciada por cualquier procedimiento almacenado anidado ejecutado por el procedimiento almacenado que creó la tabla. El proceso que llamó al procedimiento almacenado que creó la tabla no puede hacer referencia a la tabla.
  • Todas las demás tablas temporales locales se descartan automáticamente al final de la sesión actual.
  • Las tablas temporales globales se eliminan automáticamente cuando finaliza la sesión que creó la tabla y todas las demás tareas dejan de hacer referencia a ellas. La asociación entre una tarea y una tabla se mantiene solo durante la vida de una sola instrucción Transact-SQL. Esto significa que una tabla temporal global se descarta al finalizar la última instrucción Transact-SQL que hacía referencia activa a la tabla cuando finalizaba la sesión de creación.
Christian Hayter
fuente
0

Tablas temporales locales : si crea tablas temporales locales y luego abre otra conexión e intenta la consulta, obtendrá el siguiente error.

solo se puede acceder a las tablas temporales dentro de la sesión que las creó.

Tablas temporales globales : a veces, es posible que desee crear una tabla temporal que sea accesible para otras conexiones. En este caso, puede usar tablas temporales globales.

Las tablas temporales globales solo se destruyen cuando se cierran todas las sesiones que se refieren a ella.

Reza Jenabi
fuente
0

Vale la pena mencionar que también hay: tablas temporales globales con ámbito de base de datos (actualmente solo es compatible con Azure SQL Database).

Las tablas temporales globales para SQL Server (iniciadas con ## nombre de tabla) se almacenan en tempdb y se comparten entre todas las sesiones de los usuarios en toda la instancia de SQL Server.

Azure SQL Database admite tablas temporales globales que también se almacenan en tempdb y tienen un alcance al nivel de la base de datos. Esto significa que las tablas temporales globales se comparten para todas las sesiones de los usuarios dentro de la misma base de datos Azure SQL. Las sesiones de usuario de otras bases de datos no pueden acceder a tablas temporales globales.

-- Session A creates a global temp table ##test in Azure SQL Database testdb1
-- and adds 1 row
CREATE TABLE ##test ( a int, b int);
INSERT INTO ##test values (1,1);

-- Session B connects to Azure SQL Database testdb1 
-- and can access table ##test created by session A
SELECT * FROM ##test
---Results
1,1

-- Session C connects to another database in Azure SQL Database testdb2 
-- and wants to access ##test created in testdb1.
-- This select fails due to the database scope for the global temp tables 
SELECT * FROM ##test
---Results
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'

ALTERAR BASE DE DATOS CONFIGURACIÓN ALCANZADA

GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }

SE APLICA A: Azure SQL Database (la característica está en vista previa pública)

Permite configurar la funcionalidad de caída automática para tablas temporales globales. El valor predeterminado es ON, lo que significa que las tablas temporales globales se descartan automáticamente cuando no están en uso en ninguna sesión. Cuando se establece en OFF, las tablas temporales globales deben eliminarse explícitamente utilizando una instrucción DROP TABLE o se eliminarán automáticamente al reiniciar el servidor.

Con las bases de datos únicas de Azure SQL Database y los grupos elásticos, esta opción se puede configurar en las bases de datos de usuarios individuales del servidor de SQL Database. En SQL Server y la instancia administrada de Azure SQL Database, esta opción se establece en TempDB y la configuración de las bases de datos de usuarios individuales no tiene ningún efecto.

Lukasz Szozda
fuente
0

No vi ninguna respuesta que muestre a los usuarios dónde podemos encontrar una tabla Global Temp. Puede ver las tablas temporales locales y globales en la misma ubicación al navegar dentro de SSMS. Captura de pantalla a continuación tomada de este enlace .

Bases de datos -> Bases de datos del sistema -> tempdb -> Tablas temporales

ingrese la descripción de la imagen aquí

Código Novato
fuente