El problema es el siguiente: elimine todos los registros de una tabla e insértelos en otra.
Tengo una tabla que está dividida por criterios de fecha. Para evitar particionar cada registro uno por uno, recopilo los datos en una tabla y los muevo periódicamente a otra tabla. Los registros copiados deben eliminarse de la primera tabla. Estoy usando la consulta DELETE con RETURNING , pero el efecto secundario es que autovacuum tiene mucho trabajo por hacer para limpiar el desorden de la tabla original.
Estoy tratando de lograr el mismo efecto (copiar y eliminar registros), pero sin crear trabajo adicional para el mecanismo de vacío.
Como estoy eliminando todas las filas (eliminando sin condiciones where), estaba pensando en TRUNCATE , pero no admite la cláusula RETURNING. Otra idea era configurar de alguna manera la tabla, para eliminar automáticamente la tupla de la página en la operación de eliminación, sin esperar el vacío, pero no encontré si es posible.
¿Puede sugerir algo que pueda usar para resolver mi problema?
Necesitas usar algo como:
--Open your transaction BEGIN; --Prevent concurrent writes, but allow concurrent data access LOCK TABLE table_a IN SHARE MODE; --Copy the data from table_a to table_b, you can also use CREATE TABLE AS to do this INSERT INTO table_b AS SELECT * FROM table_a; --Zeroying table_a TRUNCATE TABLE table_a; --Commits and release the lock COMMIT;