2010-05-27 24 views
106

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

+1

Éstos son algunos de los sumarios detalles sobre este, [aquí] (http://jayeshsorathia.blogspot.com/2012/03/beginning-sql-difference-between-local.html) –

+4

Tenga cuidado al usar la tabla variables. Si los utiliza en una consulta, pueden provocar serios problemas de rendimiento con su plan de consulta, ya que no están indexados. –

+0

En realidad, las tablas temporales se pueden indexar, si es necesario, pero eso también lleva tiempo y recursos, por lo que aún podría causar problemas de rendimiento o de recursos. –

Respuesta

80

encuentro esta explicación bastante claro (que es pura copia de Technet):

Hay dos tipos de tablas temporales: locales y globales. 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 fueron creadas o referenciadas 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.

+0

¡Excelente respuesta útil! Estaba buscando la información específica sobre si/cuando las tablas temporales globales se limpiaron automáticamente por SQL Server. – kwill

9

Citando de libros en pantalla:

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

tablas temporales se eliminan automáticamente cuando salen del ámbito de aplicación, a no ser descendido de forma explícita el uso de DROP TABLE:

  • Una tabla temporal local creada en un procedimiento almacenado se deja caer de forma automática cuando el procedimiento almacenado se completa. La tabla puede ser referenciada por cualquier procedimiento almacenado anidado ejecutado por el procedimiento almacenado que creó la tabla. La tabla no puede ser referenciada por el proceso que llamó al procedimiento almacenado que creó la tabla.
  • Todas las demás tablas temporales locales se eliminan 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 completar la última instrucción de Transact-SQL que hacía referencia activa a la tabla cuando finalizaba la sesión de creación.
247
  • variables de tabla (DECLARE @t TABLE) sólo son visibles a la conexión que la crea, y se eliminan cuando termina el lote o procedimiento almacenado.

  • tablas temporales locales (CREATE TABLE #t) son visibles sólo para la conexión que la crea, y se borran cuando la conexión es cerrado.

  • tablas temporales globales (CREATE TABLE ##t) son visibles para todos, y se borran cuando todas las conexiones que les han referenciados han cerrado.

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

+37

También vale la pena señalar: las tablas temporales locales se eliminan cuando se cierra el ámbito que las creó. Por lo tanto, si crea una tabla temporal local dentro de un sproc, y luego intenta acceder a ella fuera de ese sproc, no existirá. –

+0

+1 por Will. Estaba intentando usar una tabla temporal local como optimizador y estaba tratando de usar un procedimiento almacenado como un inicializador "crear y poblar si no existe". Como dices, no funciona, a menos que uses una tabla temporal global. – quillbreaker

+8

+1 para incluir tablas permanentes de tempdb. – CoderDennis

9

1.)Existe una tabla temporal local solo durante la duración de una conexión o, si se define dentro de una sentencia compuesta, durante la sentencia compuesta.

Las tablas temporales locales solo están disponibles para la sesión del servidor SQL o la conexión (significa usuario único) que creó las tablas. Estos son eliminados automáticamente cuando se cerró la sesión que creó las tablas . El nombre de la tabla temporal local se mira con un solo hash ("#").

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 existen para la sesión actual de la corriente usuario significa que la ventana de consulta actual. Si cierra la ventana de consulta actual o abre una nueva ventana de consulta e intentará encontrar la tabla temp anteriormente creada , le dará el error.


2.)Un tabla temporal global permanece en la base de datos de forma permanente, pero existe sólo dentro de las filas de una conexión dada. Cuando la conexión se cierra, 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 se abre la base de datos la próxima vez.

Las tablas temporales globales están disponibles para todas las sesiones de SQL Server o conexiones (significa todo el usuario). Estos pueden ser creados por cualquier usuario de conexión de servidor SQL y estos se eliminan automáticamente cuando se han cerrado todas las conexiones de SQL Server . El nombre de tabla temporal global se mira con 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 

tablas temporales globales son visibles para todas las conexiones de SQL Server mientras que las tablas temporales locales son visibles sólo a la conexión actual de SQL Server .

Cuestiones relacionadas