Postgres:在大量查询期间自动清理

时间:2018-11-14 10:12:39

标签: postgresql autovacuum

在Postgres DB(9.4)中,我们有一个包含3500万行的表。数据是快速静态的,首先插入COPY,然后计算很少的字段。

计算示例为:

UPDATE mytable 
   SET the_name = the_rank || '_' || the_number || '_' || the_name 
WHERE the_partition=5;

the_partition可能具有5个不同的值,因此不会在整个表上进行计算,但是需要5个请求才能更新the_name。

更新500,000次=>大约需要30秒 当5000000 =>应该花费300秒,即5分钟

但是对于15000000,它在很多小时后没有完成...

我怀疑自动吸尘器不能很好地完成工作,因此我尝试将其设置为更具侵略性,期望它在更新50万行后应该自动排空

ALTER TABLE mytable SET (autovacuum_vacuum_scale_factor = 0.00);
ALTER TABLE mytable SET (autovacuum_analyze_scale_factor = 0.00);
ALTER TABLE mytable SET (autovacuum_vacuum_threshold = 500000);
ALTER TABLE mytable SET (autovacuum_analyze_threshold = 500000);
ALTER TABLE mytable SET (autovacuum_vacuum_cost_limit = 10000);

但是据我了解,当我运行15000000的大更新时,它是在同一事务中,因此不会应用自动清理,并且将存储15000000条新闻行,直到请求被完成(因为PostgreSQL复制更新的行)?那么如何使计算时间变得线性呢?

0 个答案:

没有答案