Answers:
我同意ETL的说法,没有简短的答案。大小不是唯一重要的事情-我们在重负载下运行相当大的PostgreSQL OLTP数据库(某些表> 100.000.000行),当前我们仅依赖于autovacuum。
但是,对我来说,有两件事很重要:
似乎已经达成共识,除非您在数据库上有非常明确的工作负载并且您确切知道自己在做什么,否则永远都不应关闭自动真空。但是,自然地,您可以执行其他操作VACUUM
和/或ANALYZE
运行。
在考虑其他VACUUM
运行之前,我将检查自动真空度如何保持。您可以通过查询pg_stat_user_tables
和检查是否有任何表超出自动清空阈值pg_class
。我在另一个可能感兴趣的线程上发布了这样的查询:PostgreSQL上的Aggressive Autovacuum。
不幸的是,对自动分析阈值进行类似的检查并不容易(即目前尚不可能)。但是,默认情况下,自动分析会在自动抽真空之前启动很长时间,而且便宜得多。因此,基本上,如果您的数据库可以跟上自动清理的步伐,那么使用自动分析也可以。也可以从查询最后的自动分析日期pg_stat_user_tables
。
我发现(最出色的)PostgreSQL文档的某些部分对您有所帮助:
除非您配置错误,否则Autovacuum应该会很好地覆盖它。其他答案已经涵盖了这一点。
尽管有一个明确定义的手动 情况VACUUM
(更重要的是:manual ANALYZE
):临时表,autovacuum守护程序不考虑它们。我在CREATE TABLE
这里引用手册:
该自动清理守护程序不能访问,因此不能真空或分析临时表。因此,应通过会话SQL命令执行适当的清理和分析操作。例如,如果要在复杂查询中使用临时表,明智的做法
ANALYZE
是在填充后在临时表上运行。
对此有一个简短的答案,因为它取决于很多因素。系统慢吗?自动真空是否真的触及了这张桌子?等等
以下是与此主题相关的一些良好链接:
要做出明确的决定,需要了解数据库本身,以及有关正在发生的事情的更多详细信息。
我认为您无需手动清理,除非您开始看到性能下降。但是,我强烈建议您检查一下真空度和自动真空度设置,并根据需要进行调整
要查看当前设置,请运行以下查询:
SELECT *
FROM pg_settings
WHERE name LIKE '%vacuum%'
大多数字段是不言自明的,但是这里是有关它们的文档:https : //www.postgresql.org/docs/current/static/runtime-config-autovacuum.html
我要说的是,您的目标应该是配置autovacuum以始终如一地清理垃圾,但不要一直运行autovacuum
最重要的设置是:
阈值有助于防止对于小表而言过于频繁地触发清理过程。
除非您的表很大,否则默认设置可以正常工作。简而言之,如果您碰巧拥有占用100GB的表,那么您将在触发自动清理之前累积20GB的垃圾。因此,我通常建议将比例因子设置得较低。您应该自己确定多低。我在当前项目中使用0.05
阈值也可以增加。许多应用程序有几个表,这些表经常被更新,而50个元组就不多了。将其增加到1000不会导致任何问题,但是,当然,您应该考虑自己的情况
您还可以微调自动真空度,并对某些表格进行不同的设置
ALTER TABLE your_table SET (autovacuum_vacuum_scale_factor = 0.05);
如果配置scale_factor和阈值,则应该没问题。您还可以增加autovacuum_vacuum_cost_limit
,默认情况下等于vacuum_cost_limit
,该值设置为200。这是真空的一个非常重要的功能,它不允许它消耗所有资源,即使在清空过程中,您的应用程序也可以使用数据进行操作,但默认值太低。将其增加到1000不会导致任何明显的延迟,但是可以使真空过程更快地完成。
当然,您也可以手动运行真空。在最简单的情况下,您可以执行一个简单的cron作业,当您的数据库不经常访问时,它将在每晚进行一次完整清理
希望有帮助!