Puede definir un activador para mantener el número de fila deseado:
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();
Probablemente esta no sea la mejor opción, pero una vez que llegue al límite, nunca se superará. Si hay espacio para la fluctuación, puede verificar el número de fila periódicamente y eliminar el exceso de filas desde el principio.
EDITAR:
Si tiene registros realmente grandes (digamos un millón por mes), la partición puede ser la solución más fácil. Luego, simplemente puede soltar las tablas innecesarias (diga dóndemax(timestamp) < CURRENT_DATE - 1 year
). Puede usar su marca de tiempo (o una fecha derivada) como condición para la partición de rango .
Pero tenga cuidado antes de desechar los registros antiguos. ¿Estás seguro de que nunca los necesitarás?