За всеки, който попадне тук и търси как да изтрие дяловете на таблицата в PostgreSQL, ето съвременния отговор.
Решението е да не използвате оператор DELETE, защото това ще изтрие данните, без да изтрие съответните дялове на таблицата, които съдържат данните. OP попита за управление на таблици на дялове, а не за изтриване на записи, така че всяко решение, използващо оператори DELETE, добавя ненужни разходи за базата данни за изтриване на записи, оставя празни таблици на дялове на място и напълно игнорира едно от основните предимства на използването на разделяне; ОТПУСКАНЕ на таблицата, когато вече не е полезна.
В този случай решението трябва да бъде ОТПУСКАНЕ на вече ненужната таблица на дяловете. Написах решение за разрешаване на този проблем в моята производствена среда, отговорът е тук .
За да разрешите проблема с OP, функцията, която написах, може да се използва с две леки ревизии за промяна на fullTablename променлива и формата на датата. Редът на променливата fullTablename трябва да бъде променен от
fullTablename := base_table_name || '_' || to_char(startTime, dateFormat);
във формат ГГГГ-ММ-ДД_log като този
fullTablename := to_char(startTime, dateFormat) || '_' || base_table_name;
Тогава форматът на датата трябва да бъде леко модифициран от
WHEN partition_plan='day' THEN 'YYYYDDD'
към посочената конвенция за именуване на таблици
WHEN partition_plan='day' THEN 'YYYY-MM-DD'
Тогава SQL заявката, която извиква функцията за извършване на почистването, може да бъде извикана от скрипт за ежедневна поддръжка като този:
SELECT public.drop_partitions(current_date-180, 'public', 'log', 5, 'day');
Което ще ОТПУСТИ таблиците ГГГГ-ММ-ДД_log, които са 5 дни по-стари от 180 преди дни. За първоначално изпълнение за изтриване на десетки или стотици стари дялове на таблици, 5 може да се настрои на много по-висока стойност, която постига желания ефект.