Anda dapat menentukan pemicu untuk mempertahankan nomor baris yang Anda inginkan:
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();
Ini mungkin bukan opsi berkinerja terbaik, tetapi begitu Anda mencapai batasnya, itu tidak akan pernah terlampaui. Jika ada ruang untuk berfluktuasi, maka Anda dapat memeriksa nomor baris secara berkala dan menghapus baris berlebih dari awal.
EDIT:
Jika Anda memiliki log yang sangat besar (katakan satu juta per bulan) daripada mempartisi dapat menjadi solusi termudah. Anda kemudian dapat dengan mudah menjatuhkan tabel yang tidak perlu (katakan di manamax(timestamp) < CURRENT_DATE - 1 year
). Anda dapat menggunakan stempel waktu (atau tanggal yang diturunkan) sebagai syarat untuk partisi rentang .
Tapi hati-hati sebelum membuang log lama. Apakah Anda yakin tidak akan pernah membutuhkannya?