0

在 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 秒 当 5 000 000 => 应该需要 300 秒,即 5 分钟

但是对于 15 000 000,它在几个小时后并没有完成......

我怀疑自动吸尘器没有做好它的工作,所以我尝试将它设置得更积极,预计它应该在 500 000 行更新后自动吸尘

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);

但据我了解,当我运行 15 000 000 的大更新时,它在同一个事务中,因此不会应用自动真空广告广告 15 000 000 的新闻行将被存储,直到请求完成(如postgresql 复制更新的行)?那么如何使计算时间成为线性的呢?

4

0 回答 0