我有一个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那将是我的后备,但如果可能,我更愿意直接做我上面所说的。)
答案 0 :(得分:0)
我认为这里的问题是偏移的,因为你做偏移1000000你会做很多扫描,这使得索引不被使用。我不知道你的桌子有多少,但为什么不用修改日期对你的桌子进行分区。在这种情况下,您将确切地知道您需要访问哪个分区并删除数据表单。