Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 11952|Respuesta: 0

[Fuente] Explicación detallada de tablas temporales en bases de datos SQL Server

[Copiar enlace]
Publicado en 28/5/2020 10:52:28 | | | |
Las tablas temporales son muy importantes en la base de datos SQLSERVER, y a continuación se presenta una introducción detallada a las características y el uso de las tablas temporales en la base de datos SQL, solo para referencia.

Las tablas temporales son similares a las tablas persistentes, pero las tablas temporales se almacenan en tempdb y se eliminan automáticamente cuando ya no se usan. Existen dos tipos de tablas temporales: locales y globales. Se distinguen por nombre, visibilidad y disponibilidad.

La tabla temporal presenta las siguientes características:

  • Las tablas temporales locales son tablas que los usuarios añaden el prefijo "#" al crear tablas, que son independientes según las conexiones a la base de datos. Solo la conexión a la base de datos que creó la tabla temporal local tiene acceso a la tabla, y otras conexiones no pueden acceder a la tabla.
  • En diferentes conexiones de bases de datos, aunque las tablas temporales locales creadas tienen el mismo "nombre", estas tablas no tienen ninguna relación entre sí. En SQLSERVER, un mecanismo especial de nombres garantiza la independencia de las tablas temporales locales en las conexiones de bases de datos.
  • Las verdaderas tablas temporales aprovechan el espacio temporal de la base de datos, que es mantenido automáticamente por el sistema de la base de datos, ahorrando así espacio en las tablas. Y dado que el espacio temporal de la tabla generalmente utiliza memoria virtual, el número de E/S en el disco duro se reduce considerablemente, por lo que también mejora la eficiencia del sistema.
  • La tabla temporal se vacía automáticamente después de que termina la transacción o sesión, así que no tienes que recordar borrar los datos cuando se agotan.


Tablas temporales locales

El nombre de la tabla temporal local va precedido por un único símbolo numérico (#); Solo son visibles para la conexión de usuario actual (es decir, la conexión que crea la tabla temporal local); Se elimina cuando un usuario se desconecta de una instancia de SQL Server.

Por ejemplo, creamos una tabla temporal local en una conexión de base de datos con la siguiente instrucción: #Temp

Conexión con la base de datos 1:



Luego inicia la conexión de base de datos 2 al mismo tiempo para realizar la consulta #temp

Conexión con la base de datos 2:



Veamos cuál es el resultado de la conexión de base de datos 2.

Conexión con la base de datos 2:



Los resultados muestran que la conexión de base de datos 2 no puede encontrar la tabla #Temp. Esto significa que la #Temp temporal de la tabla solo es visible para la conexión de base de datos 1 que la creó, pero no para la conexión de base de datos 2.

Tabla temporal global

El nombre de una tabla temporal global está precedido por dos símbolos numéricos (##) y es visible para cualquier conexión de base de datos cuando se crea, y se elimina cuando todas las conexiones que hacen referencia a la tabla se desconectan de SQL Server.

Por ejemplo, creamos una tabla temporal global ##Temp en una conexión de base de datos con la siguiente sentencia, y luego insertamos tres filas de datos

Conexión con la base de datos 1:



Luego consultamos el ##Temp的数据 en la conexión de base de datos 2

Conexión con la base de datos 2:



El resultado de la conexión de la base de datos 2 es el siguiente

Conexión con la base de datos 2:



Como puedes ver, la conexión de base de datos 2 puede acceder con éxito a la tabla temporal global ##Temp creada por la conexión 1 de base de datos, pero si cerramos la conexión de datos 1 ahora y luego ejecutamos el ##Temp查询语句会发生什么呢 de la conexión 2 de base de datos? Los resultados son los siguientes:

Cierra la conexión 1 de la base de datos, y luego la conexión 2 se ejecuta de nuevo:



Descubrimos que, tras cerrar la conexión 1 de la base de datos, la conexión 2 no puede encontrar la tabla temporal global ##Temp了. Esto se debe a que, tras cerrar la conexión 1 de la base de datos, no hay ninguna instrucción en la conexión de base de datos 2 que use la tabla temporal ##Temp, por lo que el sqlserver piensa que no hay ninguna conexión a la base de datos que haga referencia a la tabla temporal global ##Temp了 en ese momento, por lo que hará ##Temp释放掉了.


A continuación, intentamos cerrar la tabla temporal global ##Temp持有事务中的排他锁 (X-lock) en la conexión 2 de la base de datos y luego cerrar la conexión 1.

Conexión con la base de datos 1:



Conexión con la base de datos 2:



Cierra la conexión 1 de la base de datos, y entonces la conexión 2 se ejecuta:



El resultado muestra que, aunque cerramos la conexión 1 de la base de datos, dado que la conexión 2 ha estado conteniendo la tabla temporal global ##Temp的排他锁 (bloqueo X) en la transacción, la tabla temporal # #Temp并没有随着数据库连接1的关闭而被释放掉, mientras la transacción iniciada en la conexión 2 de la base de datos no se revierta ni se confirme, la conexión de base de datos 2 siempre mantendrá la tabla temporal ##Temp的排他锁. En este momento, SQL pensará que todavía hay una conexión a la base de datos que hace referencia a la tabla temporal global ##Temp, es decir, ##Temp不会被释放掉.




Anterior:Accessor de propiedades TypeScript (set,get)
Próximo:SQL Server consulta los días anteriores de la hora actual del sistema
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com