Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 清理最大行数_Postgresql - Fatal编程技术网

Postgresql 清理最大行数

Postgresql 清理最大行数,postgresql,Postgresql,我有一个postgresql表,在其中存储“会话”记录。这些会话有时创建得非常快(有时高达每秒几百次)。我显然不能让桌子无限期地增长。因此,我有一个守护进程,定期扫描表,对大小施加外部可配置的限制 当记录数超过限制时,我想取出最旧的记录(使用限制值),以文本形式将它们写入一个单独的(非关系的)日志文件,然后从表中删除它们。我现在正在做的工作是有效的,但是有一个很高的限制,它是非常缓慢的。我当前的查询如下: SELECT * FROM sessions ORDER BY modified DESC

我有一个postgresql表,在其中存储“会话”记录。这些会话有时创建得非常快(有时高达每秒几百次)。我显然不能让桌子无限期地增长。因此,我有一个守护进程,定期扫描表,对大小施加外部可配置的限制

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

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
,但这似乎很难。这将是我的退路,但如果可能的话,我更愿意直接做我上面所说的。),由于偏移量为1000000,所以需要进行大量扫描,这使得索引未被使用。我不知道您的表sise是多少,但为什么不使用修改的日期对表进行分区呢。在本例中,您将确切地知道需要访问和删除数据表单的分区

我认为这里的问题是偏移量,因为偏移量为1000000,所以需要进行大量扫描,这使得索引没有被使用。我不知道您的表sise是多少,但为什么不使用修改的日期对表进行分区呢。在本例中,您将确切地知道需要访问和删除数据表单的分区

1)您能否对查询运行
解释
,以确定postgresql是否实际命中了您创建的索引?2) 选择
修改的
在给定时间戳之前的所有记录是否合适?这可能会更好地击中一个指数。所以,我把我的例子简化了。这个问题比我想象的要复杂得多(我省略了上面的WHERE条款,虽然我认为它不相关,但结果却是关键的)。感谢@AndrewRueckert提供运行解释的建议。我从中学到了很多(除其他外,它需要顺序扫描),并且基本上按照您的建议执行:首先选择以确定参考时间戳,然后反向顺序选择以查找比时间戳早的行。使用新的流加上一个索引,典型情况下只需几秒钟。1)您能否对查询运行
EXPLAIN
,以确定postgresql是否实际命中了您创建的索引?2) 选择
修改的
在给定时间戳之前的所有记录是否合适?这可能会更好地击中一个指数。所以,我把我的例子简化了。这个问题比我想象的要复杂得多(我省略了上面的WHERE条款,虽然我认为它不相关,但结果却是关键的)。感谢@AndrewRueckert提供运行解释的建议。我从中学到了很多(除其他外,它需要顺序扫描),并且基本上按照您的建议执行:首先选择以确定参考时间戳,然后反向顺序选择以查找比时间戳早的行。有了新的流加上一个索引,典型情况下只需要几秒钟。我认为问题在于缺少键。我认为问题在于缺少键。