我正在开发一个网关应用程序,我正在使用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();
我的问题是:有没有更聪明的方法自动从数据库中删除旧元组?
2条答案
按热度按时间cygmwpex1#
这太长了,不能发表评论。
DELETE
不是删除大量记录的好方法,因为它会产生大量开销。对于大型表,通常使用使用表分区的方法。基本上,表分区意味着基于分区键,单个表存储在多个不同的文件中。在您的情况下,分区键将基于
sqltime
--根据你的需要,它可以是一小时,一天,一周,一个月或其他任何时间。这样的想法是,您可以很容易地按计划删除分区。删除分区比删除分区对数据库的影响小得多。
ymzxtsji2#
即使你真的想用触发器来做,也没有理由对每一行都这样做。每句话一次就够了。
如果您不知道我在说什么,请看一下posgresql文档中的触发器,或者更好地看一下解释如何创建触发器的页面。
最好是学习如何使用调度程序,比如
cron
在linux或Task Scheduler
在windows上,定期计划此操作。在运行真空之前,delete释放的空间不能被insert重用。因此,除非您要在表上运行“手动”抽真空(或者改用分区),否则在小于autovacuum\vacuum\scale\u factor(默认值为0.2)的批中删除可能没有多大意义。