Вы можете определить триггер для сохранения желаемого номера строки:
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
). Вы можете использовать свою временную метку (или производную дату) в качестве условия для разделения диапазона .
Но будьте осторожны, перед тем как выбросить старые журналы. Вы уверены, что они вам никогда не понадобятся?