Вы можете определить триггер для сохранения желаемого номера строки:
CREATE OR REPLACE FUNCTION trf_keep_row_number_steady()
RETURNS TRIGGER AS
$body$
BEGIN
-- delete only where are too many rows
IF (SELECT count(id) FROM log_table) > rownum_limit
THEN
-- I assume here that id is an auto-incremented value in log_table
DELETE FROM log_table
WHERE id = (SELECT min(id) FROM log_table);
END IF;
END;
$body$
LANGUAGE plpgsql;
CREATE TRIGGER tr_keep_row_number_steady
AFTER INSERT ON log_table
FOR EACH ROW EXECUTE PROCEDURE trf_keep_row_number_steady();
Это, вероятно, не самый эффективный вариант, но как только вы достигнете предела, он никогда не будет превышен. Если есть место для колебаний, вы можете периодически проверять номер строки и удалять лишние строки с самого начала.
РЕДАКТИРОВАТЬ:
Если у вас действительно большие журналы (скажем, миллион в месяц), то разделение может быть самым простым решением. Затем вы можете просто удалить ненужные таблицы (скажем, гдеmax(timestamp) < CURRENT_DATE - 1 year
). Вы можете использовать свою временную метку (или производную дату) в качестве условия для разделения диапазона .
Но будьте осторожны, перед тем как выбросить старые журналы. Вы уверены, что они вам никогда не понадобятся?
Я создал более общую, независимую от таблицы функцию.
Функция принимает 4 параметра:
Таким образом, вы можете создать, сколько триггеров вы хотите вызвать одну и ту же функцию.
Надеюсь это поможет.
источник
Я создал этот процесс и запустил его из PG Agent (или в зависимости от заданий windows или cron). У меня может быть больше строк, это только делает мою таблицу журналов не слишком большой. Сохраняет накладные расходы на триггер.
источник