¿Qué son las transacciones en SQL?

tempdb: El Archivo Temporal de SQL Server

Valoración: 4.64 (4604 votos)

En el mundo de la computación, los archivos temporales son una herramienta común utilizada por diversas aplicaciones para gestionar información de forma transitoria. Piensa en ellos como borradores o áreas de trabajo rápidas que los programas crean y eliminan según sea necesario. Un ejemplo clásico es el que vemos en procesadores de texto como Word, donde se generan archivos .tmp para almacenar datos mientras trabajas, ayudando a liberar memoria o sirviendo como red de seguridad en caso de fallos. Estos archivos existen solo durante la sesión de uso y se eliminan al cerrar el programa normalmente.

¿Qué es un archivo tmp y para qué sirve?
Un archivo temporal es un archivo que se crea para almacenar temporalmente información con el fin de liberar memoria para otros fines o como medida de seguridad para evitar pérdidas de datos cuando un programa realiza determinadas funciones.

Esta idea de almacenamiento temporal es fundamental también en sistemas de gestión de bases de datos, y SQL Server tiene su propio espacio dedicado para ello: la base de datos tempdb. A diferencia de los archivos temporales simples de una aplicación de escritorio, tempdb es una base de datos de sistema compleja, un recurso global compartido por todas las sesiones y usuarios conectados a una instancia de SQL Server, Azure SQL Database, Azure SQL Managed Instance o SQL database en Microsoft Fabric.

Índice de Contenido

tempdb: El Corazón Temporal de SQL Server

tempdb es una base de datos de sistema vital en SQL Server. Su propósito principal es servir como un área de trabajo temporal para una variedad de operaciones que requieren espacio no persistente. Es un recurso global, lo que significa que los objetos creados en tempdb por una sesión pueden ser visibles para otras sesiones (dependiendo del tipo de objeto temporal, como tablas temporales globales). Sin embargo, y crucialmente, tempdb se recrea desde cero cada vez que se inicia la instancia del Motor de Base de Datos. Esto asegura que siempre comience vacío y que ninguna información de sesiones anteriores persista.

Las operaciones dentro de tempdb se registran mínimamente. Esto contribuye a su rendimiento, ya que el registro completo sería innecesario dada su naturaleza no persistente. La falta de durabilidad significa que no se permite realizar copias de seguridad ni restaurar tempdb.

¿Qué Almacena tempdb? Objetos Temporales y Más

tempdb almacena una mezcla de objetos creados explícitamente por los usuarios y objetos internos generados por el propio Motor de Base de Datos para gestionar diversas operaciones.

Objetos de Usuario

Estos son objetos que los usuarios o aplicaciones crean de forma intencionada para uso temporal. Incluyen:

  • Tablas temporales globales y locales (precedidas por ## y # respectivamente) y sus índices.
  • Procedimientos almacenados temporales.
  • Variables de tabla.
  • Tablas devueltas por funciones con valores de tabla (TVFs).
  • Cursores.

Aunque se crean en tempdb, estos objetos de usuario se comportan de manera similar a los creados en bases de datos de usuario, pero sin garantía de durabilidad y se eliminan automáticamente cuando la sesión que los creó se desconecta (para objetos locales) o cuando no hay sesiones activas que los referencien (para objetos globales).

Objetos Internos

El Motor de Base de Datos utiliza tempdb intensivamente para sus propias necesidades operativas. Estos objetos internos son creados y gestionados por el sistema sin intervención explícita del usuario. Algunos ejemplos son:

  • Tablas de trabajo para almacenar resultados intermedios de operaciones como spools, cursores, ordenaciones y almacenamiento temporal de objetos grandes (LOBs).
  • Archivos de trabajo para operaciones de combinación hash o agregación hash.
  • Resultados intermedios de ordenación para operaciones como la creación o reconstrucción de índices (si se especifica SORT_IN_TEMPDB) o ciertas consultas con GROUP BY, ORDER BY o UNION.

Cada objeto interno requiere al menos nueve páginas de disco: una página IAM y una extensión de ocho páginas.

Version Stores (Almacenes de Versiones)

Los version stores son colecciones de páginas de datos que almacenan las versiones de filas necesarias para soportar el control de versiones de filas (row versioning). Esto es crucial para:

  • Transacciones que utilizan los niveles de aislamiento READ COMMITTED basado en control de versiones de filas o SNAPSHOT.
  • Operaciones que generan versiones de fila, como operaciones de índice en línea, Conjuntos de Resultados Activos Múltiples (MARS) y desencadenadores AFTER.

Hay dos tipos principales de almacenes de versiones: uno común y otro específico para operaciones de creación de índices en línea.

Características Clave y Restricciones de tempdb

Entender el comportamiento único de tempdb es fundamental para su gestión eficaz:

  • Recreación al Inicio: Como se mencionó, tempdb se reinicia y se vacía completamente cada vez que se inicia el servicio de SQL Server.
  • No Persistente: Ningún dato almacenado en tempdb sobrevive a un reinicio del servicio.
  • Registro Mínimo: Las operaciones se registran mínimamente para optimizar el rendimiento.
  • Propietario: tempdb es propiedad del usuario 'sa'.
  • Restricciones Operativas: Hay ciertas operaciones de base de datos que no están permitidas en tempdb, incluyendo:
    • Agregar grupos de archivos.
    • Realizar copias de seguridad o restauraciones.
    • Cambiar la intercalación (collation).
    • Cambiar el propietario.
    • Crear instantáneas de base de datos (database snapshots).
    • Eliminar la base de datos.
    • Eliminar el usuario 'guest'.
    • Habilitar Change Data Capture (CDC).
    • Participar en la duplicación de bases de datos (database mirroring).
    • Eliminar el grupo de archivos primario, el archivo de datos primario o el archivo de registro.
    • Renombrar la base de datos o el grupo de archivos primario.
    • Ejecutar DBCC CHECKALLOC o DBCC CHECKCATALOG.
    • Establecer la base de datos en OFFLINE o READ_ONLY.

Configuración Física y Número de Archivos

La configuración física de tempdb tiene un impacto directo en el rendimiento general de SQL Server. tempdb se compone de archivos de datos y un archivo de registro.

Configuración inicial típica (basada en la base de datos modelo por defecto):

ArchivoNombre LógicoNombre FísicoTamaño InicialCrecimiento del Archivo
Datos Primariotempdevtempdb.mdf8 MBAutocrecimiento por 64 MB hasta llenar disco
Archivos de Datos Secundariostemp#tempdb_mssql_#.ndf8 MBAutocrecimiento por 64 MB hasta llenar disco
Registrotemplogtemplog.ldf8 MBAutocrecimiento por 64 MB hasta 2 TB

Es crucial que todos los archivos de datos de tempdb tengan el mismo tamaño inicial y los mismos parámetros de crecimiento. Esto se debe a que SQL Server utiliza un algoritmo de llenado proporcional que distribuye las asignaciones de datos de manera uniforme entre los archivos, favoreciendo los que tienen más espacio libre. Si los archivos tienen tamaños o tasas de crecimiento diferentes, se puede generar contención en los archivos más pequeños o que crecen más lentamente.

El número de archivos de datos de tempdb es una consideración importante para mitigar la contención de asignaciones. La recomendación general es:

  • Si el número de procesadores lógicos es menor o igual a ocho, use el mismo número de archivos de datos.
  • Si el número de procesadores lógicos es mayor a ocho, comience con ocho archivos de datos. Si observa contención de asignaciones persistente, aumente el número de archivos en múltiplos de cuatro hasta que la contención disminuya a niveles aceptables.

Puede verificar los parámetros actuales usando la vista de catálogo `sys.database_files` en tempdb.

¿Qué es una tabla temporal en SQL?
Una tabla temporal con versión del sistema es un tipo de tabla de usuario diseñada para conservar un historial completo de los cambios de datos y facilitar los análisis en un momento específico.4 feb 2025

Mover los archivos de tempdb es posible si necesita colocarlos en un subsistema de E/S más rápido o en discos separados de las bases de datos de usuario.

tempdb en Entornos Cloud

En Azure SQL Database, Azure SQL Managed Instance y SQL database en Microsoft Fabric, el comportamiento y la configuración de tempdb pueden diferir ligeramente de una instancia de SQL Server local:

  • Azure SQL Database (Single/Elastic Pool): Cada base de datos única tiene su propio tempdb. En un pool elástico, tempdb es un recurso compartido para las bases de datos en el pool, pero los objetos temporales de una base de datos no son visibles para otras en el mismo pool. Las tablas temporales globales son de alcance limitado a la base de datos.
  • Azure SQL Managed Instance: Permite configurar el número de archivos, incrementos de crecimiento y tamaño máximo, de forma más similar a SQL Server local. Soporta objetos temporales globales visibles entre sesiones dentro de la misma instancia gestionada.
  • SQL database en Microsoft Fabric: Similar a Azure SQL Database, las tablas temporales globales tienen alcance limitado a la base de datos.

Las limitaciones de tamaño y rendimiento de tempdb en estos entornos cloud están ligadas a los límites de recursos del nivel de servicio o pool seleccionado.

Optimizando el Rendimiento de tempdb

Un tempdb lento o con contención puede degradar drásticamente el rendimiento de toda la instancia de SQL Server. La optimización es clave:

  • Inicialización Instantánea de Archivos (IFI): Habilite IFI para las cuentas de servicio de SQL Server. Esto permite que los archivos de datos (y archivos de registro de hasta 64 MB en SQL Server 2022+) crezcan instantáneamente sin tener que pasar por el proceso de puesta a cero de páginas, mejorando significativamente el rendimiento del autocrecimiento.
  • Preasignar Espacio: Configure el tamaño inicial de los archivos de tempdb lo suficientemente grande como para acomodar la carga de trabajo típica. Esto evita autocrecimientos frecuentes que consumen tiempo y recursos.
  • Autocrecimiento: Mantenga el autocrecimiento habilitado como una medida de seguridad para manejar picos inesperados de uso, pero no dependa de él para el crecimiento regular.
  • Múltiples Archivos de Datos: Como se mencionó, use múltiples archivos de datos de igual tamaño y crecimiento para distribuir la carga de E/S y reducir la contención de asignaciones (PAGELATCH_UP en páginas GAM/SGAM/PFS).
  • Subsistema de E/S Rápido: Coloque los archivos de tempdb en los discos más rápidos disponibles. Si hay contención de E/S entre tempdb y las bases de datos de usuario, sepárelos en diferentes conjuntos de discos.
  • Durabilidad Retardada: tempdb siempre tiene la durabilidad retardada habilitada, independientemente de la configuración, ya que no requiere recuperación después de un inicio.

Mejoras de Rendimiento en Versiones Recientes de SQL Server

SQL Server ha introducido varias mejoras en tempdb a lo largo de las versiones:

  • SQL Server 2016: Introdujo el almacenamiento en caché de tablas temporales y variables de tabla para acelerar su creación/eliminación, mejoró el protocolo de bloqueo (latching) de páginas de asignación y redujo la sobrecarga de registro. El instalador comenzó a crear múltiples archivos de datos de tempdb por defecto. Los archivos de datos múltiples autocrecen simultáneamente (eliminando la necesidad de la trace flag 1117) y todas las asignaciones usan extensiones uniformes (eliminando la necesidad de la trace flag 1118). AUTOGROW_ALL_FILES está siempre activado para el grupo de archivos PRIMARY.
  • SQL Server 2017: El instalador mejora las advertencias sobre el tamaño inicial y la IFI. La DMV `sys.dm_tran_version_store_space_usage` ayuda a monitorear el uso del almacén de versiones por base de datos. Las características de procesamiento de consultas inteligentes reducen los derrames de memoria en tempdb.
  • SQL Server 2019: No usa la opción FILE_FLAG_WRITE_THROUGH al abrir archivos de tempdb. Introdujo la Metadata Optimizada en Memoria para tempdb, eliminando la contención de metadatos de objetos temporales (las tablas del sistema que gestionan metadatos pueden ser tablas optimizadas en memoria sin bloqueos). Las actualizaciones concurrentes de páginas PFS reducen la contención de bloqueos de página en todas las bases de datos, lo cual es común en tempdb.
  • SQL Server 2022: IFI para el crecimiento del archivo de registro hasta 64 MB.

Metadata Optimizada en Memoria para tempdb (SQL Server 2019+)

Esta es una característica significativa para cargas de trabajo con alta creación/eliminación de objetos temporales. Al habilitarla, las tablas del sistema que gestionan metadatos de objetos temporales se convierten en tablas optimizadas en memoria, reduciendo drásticamente la contención de bloqueos (latch contention) en estas estructuras. Sin embargo, requiere un reinicio del servicio para activarse y tiene ciertas limitaciones. Se recomienda enlazar tempdb a un grupo de recursos (resource pool) del Resource Governor para limitar el consumo de memoria de esta característica y evitar problemas de memoria insuficiente.

Planificación de Capacidad y Monitoreo

Determinar el tamaño adecuado para tempdb es un ejercicio continuo. Se recomienda analizar el consumo de espacio en un entorno de prueba replicando la carga de trabajo típica, incluyendo el mantenimiento de índices. Luego, ajuste el tamaño inicial según el uso máximo observado, considerando la actividad concurrente proyectada.

El monitoreo constante es vital para detectar problemas de espacio o contención antes de que afecten a los usuarios. Use las siguientes DMVs:

  • `sys.dm_db_file_space_usage`: Muestra el espacio libre, y el espacio utilizado por almacenes de versiones, objetos internos y objetos de usuario en tempdb.
  • `sys.dm_db_session_space_usage` y `sys.dm_db_task_space_usage`: Permiten monitorear la asignación y desasignación de páginas en tempdb a nivel de sesión o tarea, ayudando a identificar qué consultas u objetos temporales consumen más espacio.

Ejemplo de consulta para ver el espacio utilizado por diferentes tipos de objetos en tempdb:

SELECT SUM(unallocated_extent_page_count) * 8.0 / 1024 AS tempdb_free_data_space_mb, SUM(version_store_reserved_page_count) * 8.0 / 1024 AS tempdb_version_store_space_mb, SUM(internal_object_reserved_page_count) * 8.0 / 1024 AS tempdb_internal_object_space_mb, SUM(user_object_reserved_page_count) * 8.0 / 1024 AS tempdb_user_object_space_mb FROM tempdb.sys.dm_db_file_space_usage;

Preguntas Frecuentes sobre tempdb

¿Puedo hacer una copia de seguridad de tempdb?

No, no se permite realizar copias de seguridad ni restaurar tempdb. Se recrea automáticamente cada vez que se inicia el servicio de SQL Server.

¿Qué ocurre si tempdb se queda sin espacio?

Si tempdb se queda sin espacio en disco y no puede autocrecer, las operaciones que intenten usarlo fallarán, lo que puede causar errores y tiempo de inactividad para las aplicaciones que dependen de SQL Server.

¿Por qué tempdb crece tanto?

tempdb crece para acomodar la carga de trabajo que utiliza objetos temporales, objetos internos o el almacén de versiones. Consultas complejas, operaciones de ordenación grandes, construcciones de índices en línea, transacciones de larga duración con aislamiento SNAPSHOT o READ COMMITTED con control de versiones pueden consumir grandes cantidades de espacio en tempdb.

¿Puedo mover los archivos de tempdb?

Sí, es posible mover los archivos de datos y registro de tempdb a una ubicación diferente. Esto a menudo se hace para colocarlos en un subsistema de E/S más rápido o en discos dedicados.

¿Qué son las contenciones de asignación en tempdb?

Las contenciones de asignación ocurren cuando múltiples procesos intentan asignar o desasignar páginas en tempdb simultáneamente, creando cuellos de botella en las páginas de gestión de espacio (GAM, SGAM, PFS). Tener múltiples archivos de datos de tempdb y la Metadata Optimizada en Memoria (en versiones recientes) ayuda a mitigar esto.

Conclusión

Aunque a menudo pasa desapercibido, tempdb es una base de datos crítica para el funcionamiento eficiente de SQL Server. Entender su propósito, qué almacena y cómo optimizar su configuración y rendimiento es fundamental para cualquier profesional de bases de datos. Una configuración adecuada y un monitoreo proactivo de tempdb pueden marcar una diferencia significativa en la estabilidad y velocidad de una instancia de SQL Server, garantizando que las operaciones temporales fluyan sin problemas y sin convertirse en un cuello de botella.

Si quieres conocer otros artículos parecidos a tempdb: El Archivo Temporal de SQL Server puedes visitar la categoría Bases de datos.

Ivan

Soy un entusiasta de la tecnología con especialización en bases de datos, particularmente en MySQL. A través de mis tutoriales detallados, busco desmitificar los conceptos complejos y proporcionar soluciones prácticas a los desafíos cotidianos relacionados con la gestión de datos

Aprende mas sobre MySQL

Subir