¿Qué son las tablas temporales y las tablas variables?
Cuando trabajamos con bases de datos, uno de los temas más importantes y debatidos es el uso de tablas temporales y tablas variables. Ambas sirven para manejar datos de manera provisional y tienen sus particularidades que pueden influir significativamente en el rendimiento de las consultas y la gestión de recursos. En esta clase, exploraremos las diferencias clave entre estas dos herramientas y brindaremos recomendaciones sobre cuándo usar cada una.
¿Cómo funcionan las tablas temporales?
Las tablas temporales permiten manejar datos que solo necesitas durante el tiempo que dura una sesión de conexión a la base de datos. Al crear una tabla temporal con un solo signo de gato, esta se limita a la sesión actual y se elimina automáticamente al cerrar la conexión.
CREATETABLE#UsuarioSourceTemp ( Código INT, Nombre NVARCHAR(50));INSERTINTO#UsuarioSourceTemp (Código, Nombre)SELECT Código, Nombre FROM UsuarioSource;
¿Qué es una tabla temporal global?
Si bien es posible crear tablas temporales a nivel global usando dos signos de gato, es recomendable evitar esta práctica. Estas tablas son accesibles por cualquier usuario conectado a la base de datos, lo que podría llevar a conflictos y problemas de seguridad.
CREATETABLE##UsuarioSourceGlobal ( Código INT, Nombre NVARCHAR(50));
¿Cuándo se deben borrar las tablas temporales?
Aunque las tablas temporales se eliminan al cerrar la sesión, es aconsejable utilizar el comando DROP TABLE al final de un procedimiento almacenado. Esto es importante para evitar bloqueos en la base de datos si alguna sesión queda abierta sin cerrar correctamente.
DROPTABLE#UsuarioSourceTemp;
¿Qué son las tablas variables?
Las tablas variables son una opción más eficiente si buscas manejar datos que no necesiten modificaciones masivas ni uso compartido entre distintas sesiones. A diferencia de las tablas temporales, las tablas variables son más rápidas de usar, ya que solo se declaran una única vez y se eliminan automáticamente al finalizar su ejecución. No necesitan el comando DROP TABLE.
¿Cómo crear una tabla variable?
El proceso para crear una tabla variable es similar a declarar cualquier otro tipo de variable dentro de SQL.
DECLARE@UsuarioSourceTemp2TABLE( Código INT, Nombre NVARCHAR(50));INSERTINTO@UsuarioSourceTemp2(Código, Nombre)SELECT Código, Nombre FROM UsuarioSource;
¿Cuáles son los beneficios de las tablas variables?
Eficiencia en el rendimiento: Por consumir menos recursos y generar menos bloqueos a nivel de base de datos.
Gestión automática: Se eliminan automáticamente al finalizar su ejecución.
Limitaciones de uso: No se pueden anidar con otros procedimientos almacenados como las tablas temporales.
En resumen, la elección entre tablas temporales y tablas variables depende de tus necesidades específicas en el manejo de datos y la estructura de tu sistema. En general, las tablas variables son una opción más eficiente si buscas optimizar el rendimiento y facilitar la gestión de recursos. Sin embargo, si necesitas trabajar con procedimientos almacenados donde es necesario compartir datos entre varias consultas, las tablas temporales podrían ser más adecuadas. ¡Continúa explorando y aprendiendo sobre estas herramientas para mejorar tus habilidades en la gestión de bases de datos!
Las Tablas temporales empiezan # y sólo están disponibles en tu sesión, si queremos que este disponibles para otras sesiones de manera global deben empezar con ##.
Cuando se cierra sesión las tablas se eliminan automáticamente aunque se recomienda eliminar la tabla cuando se termina el proceso.
Las tablas variables se crean en la bd tempdb.
Las tablas variables ejecutan por proceso, además que tienen menos bloqueos a nivel de base de datos.
como agregado conseguí esto y lo comprobé:
Tablas temporales locales (#):
Se crean en la base de datos tempdb.
Su vida útil está limitada a la sesión (conexión) en la que fueron creadas.
Son visibles solo para el usuario que las crea.
Se eliminan automáticamente al cerrar la conexión que las creó, incluso si la sesión finaliza de forma anormal.
Tablas temporales globales (##):
Son visibles y accesibles desde cualquier sesión (conexión).
Se eliminan automáticamente cuando la última conexión que las referencia se cierra.
Diría que se eliminan cuando la conexión que las crea se cierra y tienes otra referenciando esa muere la tabla igualmente, claro la prueba fue sin hacer nada puede que si la estuviera usando continuamente no se habría eliminado-
Difiero un poco de lo que se dice en el video, pero como todo en el mundo de SQL Server depende de lo que necesitas y como se realice. El manejo de tablas temporales ayuda a agilizar en algunos casos los querys, no me ha ido también con las variables tipo tabla, son muy buenas con pocos datos.
estoy de acuerdo contigo
En mi experiencia creo que el uso de las tablas temporales y/o variables, depende de la cantidad de datos con los que se va a trabajar, si la cantidad de datos es pequeña se deben usar tablas variables, de lo contrario, si la cantidad de datos es muy grande, es recomendable usar tablas temporales.
Yo he utilizado tablas temporales y me han funcionado muy bien, sobre todo para temas de reportería.
¿Cuando es recomendable o porque se recomienda no usarlas?
Va a depender mucho de lo que quieras hacer, son mas eficientes las tablas variable pero las tablas temporales funcionan bien dentro de procedimientos almacenados tambien.
Si se van a utilizar tablas temporales, preferiblemente donde no modifiquemos los datos de las mismas, solo se utilicen para base de consultas.
Las tablas temporales se crean en la base de datos tempdb, y al crearse las tablas se pueden dar bloqueos en esta base de datos lo que nos va afectar el rendimiento del servidor.
Ejemplo práctico de cómo se puede usar una tabla temporal en SQL Server.
Supongamos que tenemos una base de datos que contiene dos tablas: "Ventas" y "Clientes". Queremos crear una consulta que muestre el total de ventas por cliente para el mes actual. En lugar de unir las dos tablas y luego agrupar y sumar los datos, podemos usar una tabla temporal para simplificar el proceso.
Aquí te dejo un ejemplo de cómo crear una tabla temporal y utilizarla para resolver este problema:
--Creamos una tabla temporal para almacenar los datos
CREATETABLE#TempVentas(ClienteIDINT,TotalVentasMONEY);--Insertamos los datos en la tabla temporal
INSERTINTO#TempVentas(ClienteID,TotalVentas)SELECTV.ClienteID,SUM(V.Monto)ASTotalVentasFROMVentasVWHEREMONTH(V.Fecha)=MONTH(GETDATE())--Solo consideramos el mes actual
GROUPBYV.ClienteID;--Unimos la tabla temporal con la tabla de clientes para obtener los nombres de los clientes
SELECTC.Nombre,T.TotalVentasFROMClientesCJOIN #TempVentasTONC.ClienteID=T.ClienteID;--Eliminamos la tabla temporal
DROPTABLE #TempVentas;
En este ejemplo, creamos una tabla temporal llamada "#TempVentas" con dos columnas: "ClienteID" y "TotalVentas". Luego, insertamos los datos de ventas agrupados por cliente para el mes actual en la tabla temporal. Después, unimos la tabla temporal con la tabla de clientes para obtener los nombres de los clientes y mostramos el resultado final.
Finalmente, eliminamos la tabla temporal para liberar el espacio en la base de datos. La tabla temporal "#TempVentas" solo existe durante la ejecución de la consulta y se elimina automáticamente al finalizar.
Ejemplo práctico de cómo se puede utilizar una tabla variable en SQL Server.
Supongamos que tenemos una base de datos que contiene una tabla llamada "Productos". Queremos crear una consulta que muestre todos los productos cuyo precio es mayor que el promedio de los precios de todos los productos.
Aquí te dejo un ejemplo de cómo crear una tabla variable y utilizarla para resolver este problema:
--Creamos una tabla variable para almacenar los precios de los productos
DECLARE @PreciosTABLE(PrecioMONEY);--Insertamos los precios de los productos en la tabla variable
INSERTINTO @Precios(Precio)SELECTPrecioFROMProductos;--Calculamos el promedio de los precios de los productos
DECLARE @PromedioMONEY;SELECT @Promedio=AVG(Precio)FROM @Precios;--Seleccionamos los productos cuyo precio es mayor que el promedio
SELECT*FROMProductosWHEREPrecio> @Promedio;
En este ejemplo, creamos una tabla variable llamada "@Precios" con una columna "Precio". Luego, insertamos los precios de los productos de la tabla "Productos" en la tabla variable.
A continuación, calculamos el promedio de los precios de los productos utilizando la función AVG y asignamos el resultado a una variable llamada "@Promedio".
Finalmente, seleccionamos los productos de la tabla "Productos" cuyo precio es mayor que el promedio almacenado en la variable "@Promedio".
Es importante destacar que una tabla variable solo existe durante la sesión de conexión en la que fue creada y no puede ser referenciada fuera de su contexto de creación.
Si vas a usar los datos más de una vez → tabla temporal (#)
La CTE recalcula → más CPU.
Si son pocas filas → variable tabla (@)
Menos sobrecarga que una temporal.
Si solo quieres simplificar el código → CTE
No para performance.
Cual es la deferencia de estas dos a las CTE , en terminos de optimizacion de memoria?
Antes de decidir entre una tabla temporal o una variable, analiza el tamaño del conjunto de datos que vas a manejar. Como regla práctica:
Menos de 1000 filas: usa tabla variable.
Más de 1000 filas o múltiples consultas JOIN: usa tabla temporal.
¿Cuál sería un caso de uso real para el uso de estas tablas?
Tablas temporales viven dentro de un proceso o sesión. Las variables tambien pero solo pueden ser usadas dentro del mismo lote. Una tabla temporal puedes utilizarla gerarquicamente por varios procedimientos o funciones, las variable no. La temporal se recomienda borrarla cuando la dejas de usar, la variable no es necesario. La tabla variable funciona mejor con poca cantidad de datos.
Las tablas temporales de sesión son preferibles, ya que son locales a tu conexión y se eliminan al cerrar la sesión, evitando conflictos con otros usuarios. Las tablas temporales globales, aunque accesibles desde cualquier sesión, pueden generar bloqueos y complicaciones en el rendimiento. En general, es recomendable utilizar tablas variables en lugar de tablas temporales, ya que consumen menos recursos y no requieren un drop explícito al final. Así que, para mantener el rendimiento óptimo, lo mejor es optar por las tablas de sesión o variables.
Las tablas temporales son estructuras de datos que existen solo durante la sesión en la que se crean. Se utilizan cuando necesitas realizar operaciones complejas temporalmente y se eliminan automáticamente al cerrar la sesión. Son útiles para almacenar resultados intermedios, pero pueden causar bloqueos si se usan incorrectamente.
Por otro lado, las tablas variables son más ligeras y se eliminan automáticamente al finalizar el bloque en el que se declaran. Se recomiendan para manipular conjuntos de datos más pequeños, ya que consumen menos recursos.
Usa tablas temporales para operaciones en grandes conjuntos de datos y tablas variables para tareas más simples y ligeras.