【问题标题】:Autovacuum of a large table takes too long大表的 Autovacuum 耗时太长
【发布时间】:2017-01-19 08:43:33
【问题描述】:

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

更新:我的目标是尽快开始使用该表。截断会有所帮助(因为表将是空的),分析应该会有所帮助(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 任务会被锁定。 (是吗?)

【问题讨论】:

  • 1 truncate 将清除所有行,2 analyze 将收集统计数据,您无法比较这些数据
  • autovacuum 应该释放表,允许你锁定它。为问题添加一些输出
  • @VaoTsun 我意识到 TRUNCATE 和 ANALYZE 做不同的事情,但它们中的任何一个都可以帮助我(我更新了我的问题)。还添加了控制台输出。
  • 好吧,那么截断当然会更快
  • 好吧,在一个会话中运行 truncate 并让它继续工作,然后打开新连接并终止所有其他会话

标签: postgresql postgresql-9.6 autovacuum


【解决方案1】:

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

  • truncate 将从表中删除所有数据
  • 最好开启 autovacuum

【讨论】:

    【解决方案2】:

    This 会帮助你。尝试分阶段分析。

    【讨论】:

      【解决方案3】:

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

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

      慢真空的解决办法是vacuum more often!还要注意 settnig autovaccum 关闭may not switch it off completely

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-09
        • 2021-08-07
        • 2018-02-27
        • 2013-05-28
        相关资源
        最近更新 更多