清理最旧的最大行

时间:2017-08-16 22:34:35

标签: postgresql

我有一个postgresql表,我在其中存储" session"记录。这些会议有时会很快创建(有时会达到几百秒)。我显然不能让桌子无限增长。所以我有一个守护进程定期扫描表格,对大小施加外部可配置的限制。

当记录数超过限制时,我想拉出最旧的记录(使用限制值),将它们写入文本形式的单独(非关系)日志文件,然后从表中删除它们。我目前正在做的工作,但有一个很高的限制,它是非常缓慢的。我目前的查询是这样的:

SELECT * FROM sessions ORDER BY modified DESC OFFSET 1000000 LIMIT 10000;

我的程序然后将最近最少修改的记录记录到脱机历史记录中,然后单独执行SQL DELETE以删除行。问题是,如果我说1000010记录,上面的查询需要大约25-30秒才能获得这10条记录。在modified字段上创建索引似乎没有任何明显的效果,因此我假设postgres在计算前100万条记录然后将它们排除之前在某处创建临时数据集。

有没有更好的方法来获得相同的结果呢?我基本上只想获得最老的" count(*) - N"表的行。

(我现在意识到我可以先做一个单独的查询来获取表的count(*),然后反转查询的ORDER BY子句,然后只使用LIMIT,但这似乎是kludgy那将是我的后备,但如果可能,我更愿意直接做我上面所说的。)

1 个答案:

答案 0 :(得分:0)

我认为这里的问题是偏移的,因为你做偏移1000000你会做很多扫描,这使得索引不被使用。我不知道你的桌子有多少,但为什么不用修改日期对你的桌子进行分区。在这种情况下,您将确切地知道您需要访问哪个分区并删除数据表单。