Postgresql具有真空功能,可以重新收集死元组占用的空间。默认情况下,自动真空打开,并根据配置设置运行。
当我检查pg_stat_all_tables的输出,即last_vacuum和last_autovacuum时,数据库中的大多数表都没有运行autovacuum,这些表具有足够数量的死元组(超过1K)。当这些表很少使用时,我们也会得到2-3小时的时间窗口。
我想问一下,仅依靠自动真空是一个好主意吗?
autovacuum是否需要特殊设置才能正常工作?
我们应该设置手动真空吸尘器吗?我们应该同时使用两者还是仅关闭autovacuum并仅使用手动真空?
答案 0 :(得分:1)
你绝对应该使用autovacuum。
目前是否有任何autovacuum进程在运行?
这样的表上的手册VACUUM
是否成功?
设置log_autovacuum_min_duration = 0
以获取有关日志中的autovacuum处理的信息。
如果系统活动过高,autovacuum可能无法跟上。在这种情况下,建议将autovacuum配置为更多攻击性,例如设置autovacuum_vacuum_cost_limit = 1000
。
答案 1 :(得分:1)
https://www.postgresql.org/docs/current/static/routine-vacuuming.html
PostgreSQL数据库需要定期维护,称为吸尘。 对于许多安装,只需进行抽真空就足够了 由autovacuum守护程序,在第24.1.6节中描述。您 可能需要调整那里描述的autovacuuming参数 为您的情况获得最佳结果。一些数据库管理员 将要补充或替换守护进程的活动 手动管理的VACUUM命令,通常执行 根据cron或任务计划程序脚本的计划表。
vacuum创建了重要的IO,因为https://www.postgresql.org/docs/current/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST可以满足您的需求。
此外,您可以为每个表设置autovacuum设置,使其更加“自定义”https://www.postgresql.org/docs/current/static/sql-createtable.html#SQL-CREATETABLE-STORAGE-PARAMETERS
以上内容可以让您了解为什么1K死元组可能不足以进行autovacuum以及如何更改它。
手动VACUUM
是一次运行的完美解决方案,而运行系统时我绝对依赖autovacuum守护进程