Tenga en cuenta que, en Postgres, el comportamiento predeterminado para las tablas temporales es que no se eliminan automáticamente y los datos se conservan en la confirmación. Ver ON COMMIT
.
Sin embargo, las tablas temporales se eliminan al final de una sesión de la base de datos:
Las tablas temporales se eliminan automáticamente al final de una sesión u, opcionalmente, al final de la transacción actual.
Hay múltiples consideraciones que debes tener en cuenta:
- Si desea explícitamente
DROP
una tabla temporal al final de una transacción, créela conCREATE TEMPORARY TABLE ... ON COMMIT DROP
sintaxis. - En presencia de agrupación de conexiones , una sesión de base de datos puede abarcar varias sesiones de cliente; para evitar conflictos en
CREATE
, debe descartar sus tablas temporales, ya sea antes de devolver una conexión al grupo (por ejemplo, haciendo todo dentro de una transacción y usandoON COMMIT DROP
sintaxis de creación), o según sea necesario (precediendo cualquierCREATE TEMPORARY TABLE
declaración con un correspondienteDROP TABLE IF EXISTS
, que tiene la ventaja de trabajar también con transacciones externas, p. si la conexión se usa en modo de confirmación automática). - Mientras la tabla temporal está en uso, ¿cuánto cabrá en la memoria antes de desbordarse en el disco? Ver los
temp_buffers
opción enpostgresql.conf
- ¿Hay algo más de lo que deba preocuparme cuando trabajo a menudo con tablas temporales? Se recomienda una aspiradora después de haber eliminado las tablas temporales, para limpiar las tuplas inactivas del catálogo. Postgres aspirará automáticamente cada 3 minutos más o menos cuando utilice la configuración predeterminada (
auto_vacuum
).
Además, sin relación con su pregunta (pero posiblemente relacionado con su proyecto):tenga en cuenta que, si tiene que ejecutar consultas en una tabla temporal después lo ha rellenado, entonces es una buena idea crear índices apropiados y emitir un ANALYZE
en la tabla temporal en cuestión después ya terminaste de insertarlo. De forma predeterminada, el optimizador basado en costos asumirá que una tabla temporal recién creada tiene ~1000 filas y esto puede resultar en un bajo rendimiento si la tabla temporal realmente contiene millones de filas.