sql >> Base de Datos >  >> RDS >> PostgreSQL

postgresql eliminar tablas de particiones

Para cualquiera que termine aquí buscando cómo eliminar las particiones de la tabla en PostgreSQL, esta es la respuesta moderna.

La solución es no usar una declaración DELETE porque eso eliminará los datos sin eliminar las particiones de tabla correspondientes que contenían los datos. El OP preguntó sobre la administración de tablas de partición, no sobre la eliminación de registros, por lo que cualquier solución que use declaraciones DELETE agrega una sobrecarga innecesaria de la base de datos para eliminar registros, deja las tablas de partición vacías en su lugar e ignora por completo uno de los principales beneficios de usar la partición; DROPing la mesa cuando ya no es útil.

En este caso, la solución debe ser DROP la tabla de particiones que ya no se necesita. He escrito una solución para resolver este problema en mi entorno de producción, la respuesta es aquí .

Para resolver el problema del OP, la función que escribí se puede usar con dos ligeras revisiones para modificar el fullTablename variable y el formato de fecha. La línea de la variable fullTablename debe cambiarse de

fullTablename := base_table_name || '_' || to_char(startTime, dateFormat);

al formato AAAA-MM-DD_log como este

fullTablename := to_char(startTime, dateFormat) || '_' || base_table_name;

Luego, el formato de fecha debe modificarse ligeramente de

WHEN partition_plan='day'   THEN 'YYYYDDD'

a la convención de nomenclatura de tablas establecida

WHEN partition_plan='day'   THEN 'YYYY-MM-DD'

Luego, la consulta SQL que llama a la función para realizar la limpieza se puede llamar desde un script de mantenimiento diario como este:

SELECT public.drop_partitions(current_date-180, 'public', 'log', 5, 'day');

Que DROP las tablas YYYY-MM-DD_log que son 5 días mayores de 180 hace días. Para una ejecución inicial para eliminar docenas o cientos de particiones de tablas antiguas, el 5 se puede establecer en un valor mucho más alto que logre el efecto deseado.