如何从数据库中自动删除旧元组?

yvgpqqbh  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(278)

我正在开发一个网关应用程序,我正在使用postgresql存储接收到的数据,然后再转发它们。为了避免磁盘饱和,我想删除所有超过一定时间的元组(在这一刻,我考虑30或60天)。
为了实现这一点,目前,我编写了一个触发器,在某个表中的每个insert语句之后,删除所有早于此特定时间的条目(您可以在下面找到它)。这似乎是工作,但我有点担心会发生什么与更高的日期率。

DROP TRIGGER IF EXISTS delete_old_measures
ON my_table_1;
CREATE OR REPLACE FUNCTION dropOldMeasures() RETURNS TRIGGER AS $$
    BEGIN
        DELETE FROM my_table_1 WHERE sqltime < now()-'30 day'::interval;
        RETURN NULL;
    END;
    $$
    LANGUAGE 'plpgsql';

CREATE TRIGGER delete_old_measures
AFTER INSERT
ON my_table_1
FOR EACH ROW EXECUTE PROCEDURE dropOldMeasures();

我的问题是:有没有更聪明的方法自动从数据库中删除旧元组?

cygmwpex

cygmwpex1#

这太长了,不能发表评论。 DELETE 不是删除大量记录的好方法,因为它会产生大量开销。
对于大型表,通常使用使用表分区的方法。基本上,表分区意味着基于分区键,单个表存储在多个不同的文件中。在您的情况下,分区键将基于 sqltime --根据你的需要,它可以是一小时,一天,一周,一个月或其他任何时间。
这样的想法是,您可以很容易地按计划删除分区。删除分区比删除分区对数据库的影响小得多。

ymzxtsji

ymzxtsji2#

即使你真的想用触发器来做,也没有理由对每一行都这样做。每句话一次就够了。
如果您不知道我在说什么,请看一下posgresql文档中的触发器,或者更好地看一下解释如何创建触发器的页面。
最好是学习如何使用调度程序,比如 cron 在linux或 Task Scheduler 在windows上,定期计划此操作。
在运行真空之前,delete释放的空间不能被insert重用。因此,除非您要在表上运行“手动”抽真空(或者改用分区),否则在小于autovacuum\vacuum\scale\u factor(默认值为0.2)的批中删除可能没有多大意义。

相关问题