Автоматическое устаревание (удаление) старых записей в Postgres

15

Есть ли у Postgres какие-либо функции для поддержки устаревших старых записей?

Я хочу использовать Postgres для регистрации, как своего рода очередь, где записи (события журнала) старше двух недель автоматически удаляются.

Базилик Бурк
источник
Используйте разбиение. Простое удаление записей не уменьшит размер таблицы на диске.
Сиванн
@sivann Разве ваша рекомендация не предполагает, что его проблема связана с размером диска? Если его проблема связана со временем выполнения запроса, кажется, что удаление может быть более простым ответом, чем разбиение, нет? (все еще пытаюсь понять это сам)
Стивенм
1
Проблема в том, что записи журнала перестают быть интересными через определенное время. Удаление старых строк должно освободить место для новых свежих строк.
Василий Бурк

Ответы:

15

Нет встроенной функции для автоматического удаления строк в режиме, основанном на времени (о котором я бы знал).

Вы можете запускать ежедневное (вы решаете) задание cron для планирования простых DELETEкоманд или использовать pgAgent для этой цели.

Или вы можете использовать разделение с еженедельными разделами, которые наследуются от главной таблицы , давайте назовем это log. Это сделало бы удаление очень дешевым : просто оставьте последние две недели и удалите старые разделы.

Создайте a RULEили a TRIGGERв главной таблице, которая перенаправляет вставки в раздел текущей недели на основе системного времени. Всегда входите в главную таблицу log. Создайте дочерние таблицы заранее. Сделайте это на несколько недель вперед, чтобы быть уверенным, и запустите еженедельную работу cron, которая добавляет будущие дочерние таблицы ...

В руководстве приведены примеры кода .
Связанный ответ с функцией plpgsql, создающей таблицы автоматически:

Соответствующее решение воссоздает RULEдля перенаправления INSERT. Функция триггера может записывать в текущий раздел динамически ...

Эрвин Брандштеттер
источник