大桌子的自动真空需要太长时间

时间:2017-01-19 08:43:34

标签: postgresql postgresql-9.6 autovacuum

我将9.4 postgresql集群升级到9.6。 (通过pg_upgrade,所以我的数据库统计信息没有移动到新的集群) 我有一张大桌子(约450M记录)。这个表在我的代码中使用很多(很多选择和更少的upsert)。 当我开始我的postgres服务时,Postgres会自动启动autovacuum,它会锁定我的桌面。所以我无能为力:既不截断表也不手动分析。 我尝试在配置文件中设置autovacuum = off,但它没有帮助(为什么?!我当然重新启动了服务器)

更新:我的目标是尽快开始使用该表。截断将有所帮助(因为表将为空),ANALYZE应该有帮助(Postgres将开始使用正确的索引)

最快的方法是: 1)将桌子分开 要么 2)分析表格 ? 任何帮助将不胜感激。

更新 以下是查看锁定的查询输出:

SELECT psa.pid,granted,query FROM pg_locks pl LEFT JOIN pg_stat_activity psa ON pl.pid = psa.pid where locktype='relation';


  pid  | granted | query                                                                                                                          
-------+---------+---------------------------

 11831 | t       | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
 11831 | t       | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
 11831 | t       | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
 11831 | t       | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
 11831 | t       | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
 11831 | t       | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
 11831 | t       | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
 11831 | t       | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
 11831 | t       | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)

当我从psql控制台分析表并查看来自pg_stat_activity的数据时:

query                  |         backend_start         |          xact_start           |          query_start          |         state_change          | state  | wait_event_type | wait_event
analyze ig_tasks_users;| 2017-01-19 10:03:30.287791+01 | 2017-01-19 10:07:11.683817+01 | 2017-01-19 10:07:11.683817+01 | 2017-01-19 10:07:11.683822+01 | active | Lock            | relation

如果我理解正确,我的VACUUM ANALYZE会锁定表格并且我的手动ANALYZE任务被锁定。 (是吗?)

3 个答案:

答案 0 :(得分:2)

在一个会话中运行truncate并保持其正常工作,然后打开新连接并使用pg_terminate_backend(pid)终止所有其他会话。 请记住

  • truncate将清除表格中的所有数据
  • autovacuum最好是

答案 1 :(得分:1)

如果自动吸尘时间太长,可能实际上是因为你关闭了一段时间。

  

常规吸尘的通常目标是经常进行标准VACUUM   足以避免需要VACUUM FULL。 autovacuum守护程序尝试   以这种方式工作,实际上永远不会发出VACUUM FULL。

缓慢真空的解决方案是vacuum more often!另请注意,将autovaccum设置为关闭may not switch it off completely

答案 2 :(得分:1)

This可以帮到你。尝试分阶段分析。