Saltear al contenido principal

Variables tabla vs tablas temporales en SQL Server

Son infinitas las veces que nos hemos preguntado cuál usar cuando pensamos en espacios temporales de trabajo. ¿Cuál es la diferencia entre las variables de tipo tabla y las tablas temporales en SQL Server? ¿Existe alguna diferencia? Si el propósito para el cual las quieres es el mismo, lo importante es que sepas dónde utilizar cada una de ellas.

Conceptos necesarios

Quiero empezar referenciando muy brevemente las definiciones oficiales de ambos objetos.

Las tablas temporales se almacenan en tempdb, solo son visibles para el usuario de la conexión actual y se eliminan cuando el usuario se desconecta de la instancia de SQL Server

Temporary Table

La variable tabla es un tipo de datos especial usado para almacenar un conjunto de resultados y procesarlos en otro momento. Table se usa principalmente para almacenar temporalmente un conjunto de filas que se devuelven como el conjunto de resultados de la función con valores de tabla.

Table (Transact-SQL)

En resumen, ambos se muestran como espacios temporales de almacenamiento donde se podrían realizar diferentes operaciones con su contenido.

¿Cómo elegir entre Tablas Temporales y Variables de Tipo Tabla?

Según los conceptos que hemos visto, no existiría ningún aspecto que me haga decidir más por uno que por el otro. Esto es justamente lo que pasa en el mundo del desarrollo, por esta razón, podemos encontrar de manera indistinta el uso de ambos objetos en los códigos que revisamos.

Es importante que podamos entrar a mayor detalle de los conceptos y así analizar las mejores alternativas. También te recomiendo que siempre realices validaciones de testing que te permitan comparar los resultados entre una y otra alternativa. No solamente para este caso, sino para cualquier otro.

Entre estos dos objetos siempre ha existido un mito. Que ambos son iguales, se comportan de la misma manera ya que su propósito siempre fue el mismo. Mira este pequeño resumen que te hará decidir sobre la mejor opción.

¿Qué te parece? También puedes ver un problema recurrente con la decisión que se tome al respecto.

No te olvides también revisar cómo mejorar las variables tabla en SQL Server 2019.

Pablo Javier Fernández

www.datoptim.com
I love working on SQL Server Performance Tuning and finding the origin of the problems. Music and SQL Server passionate.

Esta entrada tiene 2 comentarios
  1. Creo que este artículo no aporta datos significativos sobre el tema.
    En primer lugar, hay que recordar que el plan de ejecución es ESTIMADO, por lo que cuando comparas cosas muy diferentes esas estimaciones pueden no ser válidas.
    A mi entender, el verdadero motivo es que las variables tipo tabla se almacenan en la RAM del servidor, mientras las tablas temporales se almacenan en los dispositivos externos (discos duros), con lo que tendremos la típica disyuntiva en estos casos: Mas velocidad y menos espacio para las variables tipo tabla y lo contrario para las tablas temporales.

    1. Leopoldo, el aporte aparece cuando comprendemos la teoría. Lo que dices es parcialmente correcto (o incorrecto, dependiendo de la perspectiva del aporte).
      Un plan de ejecución estimado y un plan de ejecución actual siguen siendo estimados de la información que genera el optimizador, sin embargo, él se basa en las estadísticas que guarda cada objeto que interviene en una consulta y en el costo que se espera en las operaciones. En este caso, la comparación entre el uso de una exacta misma consulta con diferentes objetos, simplemente muestra las diferentes reacciones que ellas tienen de acuerdo a su diseño y comportamiento de quienes intervienen.
      No hay que olvidarse que todo objeto temporal creado explíticamente (variables, tablas temporales globales o locales, SPs temporales) o implícitamente (spools, sorts, worktables) están físicamente en la base de datos tempdb y no así almacenados en RAM. Esto es fácilmente comprobable cuando, durante el uso de variables tabla o tablas temporales, consultas el contenido de sys.partitions y sys.tables en tempdb.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Close search

Carrito

Volver arriba