可以在postgresql中保留最大记录数吗?

Jha*_*ood 9 postgresql

基本上我们的 Postgresql 表的一部分用于保存服务器访问日志,因此有时在生产过程中它会变得非常大。有什么方法可以在 postgresql 中设置一个表可以拥有的最大记录数并推出最旧的记录?

dez*_*zso 12

您可以定义触发器来维护所需的行号:

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();
Run Code Online (Sandbox Code Playgroud)

这可能不是性能最佳的选项,但一旦达到限制,就永远不会超过。如果有波动的空间,那么你可以定期检查行号,从头开始删除多余的行。

编辑: 如果您有非常大的日志(比如每月一百万),那么分区可能是最简单的解决方案。然后您可以简单地删除不必要的表(比如 wheremax(timestamp) < CURRENT_DATE - 1 year)。您可以使用时间戳(或派生日期)作为范围分区的条件。

但是在丢弃旧日志之前要小心。你确定你永远不需要这些吗?

  • +1 分区建议。如果你想在没有每次扫描表的极端开销的情况下进行计数,你可以使用 pg_class.reltuples 作为近似值,或者你可以使用触发器来维护“控制”表中的计数。 (2认同)