Voor iedereen die hier belandt op zoek naar het verwijderen van de tabelpartities in PostgreSQL, hier is het moderne antwoord.
De oplossing is om geen DELETE-instructie te gebruiken, omdat de gegevens dan worden verwijderd zonder de corresponderende tabelpartities die de gegevens bevatten te verwijderen. De OP vroeg naar het beheren van partitietabellen, niet het verwijderen van records, dus elke oplossing die DELETE-instructies gebruikt, voegt onnodige databaseoverhead toe aan het verwijderen van records, laat lege partitietabellen op hun plaats en negeert een van de belangrijkste voordelen van het gebruik van partitionering; De tafel laten vallen wanneer deze niet langer bruikbaar is.
In dit geval moet de oplossing zijn om de niet langer benodigde partitietabel te DROPPEN. Ik heb een oplossing geschreven om dit probleem in mijn productieomgeving op te lossen, het antwoord is hier .
Om het probleem van de OP op te lossen, kan de functie die ik heb geschreven worden gebruikt met twee kleine revisies om de volledige tabelnaam te wijzigen variabele en het datumformaat. De variabele regel fullTablename moet worden gewijzigd van
fullTablename := base_table_name || '_' || to_char(startTime, dateFormat);
naar het YYYY-MM-DD_log formaat zoals dit
fullTablename := to_char(startTime, dateFormat) || '_' || base_table_name;
Dan moet het datumformaat enigszins worden gewijzigd van
WHEN partition_plan='day' THEN 'YYYYDDD'
volgens de vermelde tabelnaamgeving
WHEN partition_plan='day' THEN 'YYYY-MM-DD'
Vervolgens kan de SQL-query die de functie aanroept om de opschoning uit te voeren, worden aangeroepen vanuit een dagelijks onderhoudsscript als volgt:
SELECT public.drop_partitions(current_date-180, 'public', 'log', 5, 'day');
Waardoor de YYYY-MM-DD_log tabellen die 5 . zijn, DROP worden dagen ouder dan 180 dagen geleden. Voor een eerste run om tientallen of honderden oude tabelpartities te verwijderen, moet de 5 kan worden ingesteld op een veel hogere waarde die het gewenste effect bereikt.