我使用制作大型 PostgreSQL 数据库的软件(其中有一个包含一百万行的表),开发人员说我应该VACUUM
定期ANALYZE
进行。但是 PostgreSQL 数据库默认是autovacuum
打开的。
我应该抽真空/分析吗?有什么好处?自动吸尘器和手动吸尘器有什么区别
例如,在 Pgadmin3 中,我有这个:
我使用制作大型 PostgreSQL 数据库的软件(其中有一个包含一百万行的表),开发人员说我应该VACUUM
定期ANALYZE
进行。但是 PostgreSQL 数据库默认是autovacuum
打开的。
我应该抽真空/分析吗?有什么好处?自动吸尘器和手动吸尘器有什么区别
例如,在 Pgadmin3 中,我有这个:
我同意 ETL 的观点,即没有简短的答案。大小并不是唯一重要的事情——我们在重负载下运行相当大的 PostgreSQL OLTP 数据库(一些表 > 100.000.000 行),目前我们只依赖 autovacuum。
然而,有两件事对我来说似乎很重要:
似乎有一个共识,那就是永远不应该关闭 autovacuum,除非您的数据库上有非常明确的工作负载并且您确切地知道自己在做什么。但是,自然地,您可以进行额外
VACUUM
的和/或ANALYZE
运行。在考虑额外
VACUUM
的运行之前,我会检查 autovacuum 是如何跟上的。pg_stat_user_tables
您可以通过查询和来检查是否有任何表超出了 autovacuum 阈值pg_class
。我在另一个线程上发布了这样一个查询,这可能很有趣:Aggressive Autovacuum on PostgreSQL。不幸的是,对自动分析阈值进行类似的检查并不容易(即目前不可能)。但是,默认情况下,自动分析早在自动真空之前就开始了,而且便宜得多。因此,基本上,如果您的数据库可以跟上 autovacuum 的速度,那么使用 autoanalyze 也可能没问题。最后的自动分析日期也可以从 中查询
pg_stat_user_tables
。(最优秀的)PostgreSQL 文档的某些部分,我发现它们很有帮助:
Autovacuum应该可以很好地覆盖它,除非你配置错误。其他答案已经涵盖了这一点。
手动
VACUUM
(更重要的是:手动ANALYZE
)有一个明确定义的案例:临时表,它们不被 autovacuum 恶魔考虑。我在这里引用手册CREATE TABLE
:没有简短的答案,因为它取决于很多因素。系统慢吗?自动吸尘器是否真的接触到这张桌子?等等
这里有一些关于这个主题的好链接:
要做出明确的决定,需要了解数据库本身以及正在发生的事情的更多细节。
我认为您不需要手动清理,除非您开始看到性能下降。但是,我强烈建议您检查您的真空和自动真空设置并根据您的需要进行调整
要查看您当前的设置,请运行以下查询:
大多数字段都是不言自明的,但这里有关于它们的文档: https ://www.postgresql.org/docs/current/static/runtime-config-autovacuum.html
我想说,您的目标应该是配置 autovacuum 以始终如一地清理垃圾,但不要经常运行 autovacuum
最重要的设置是:
阈值有助于防止对小表过于频繁地触发清理过程。
默认设置可以正常工作,除非您有非常大的表。简单地说,如果你碰巧有一个占用 100GB 的表,你将在触发 autovacuum 之前积累 20GB 垃圾。因此,我通常建议将比例因子设置得较低。你应该自己确定多低。我在当前项目中使用 0.05
门槛也可以提高。许多应用程序有几个表,这些表经常更新,50 个元组并不多。将其增加到 1000 应该不会导致任何问题,但是当然,您应该考虑自己的情况
您还可以微调 autovacuum 并为某些表设置不同的设置
如果你配置 scale_factor 和 thresholds 你应该没问题。您也可以增加
autovacuum_vacuum_cost_limit
,默认等于vacuum_cost_limit
,设置为 200。这是 Vacuum 的一个非常重要的特性,它不会让它吃光所有资源,并且即使在清理过程中也可以让您的应用程序使用数据进行操作,但默认值太低。将其增加到 1000 不会导致任何明显的延迟,但可以让真空过程更快地完成当然,您也可以手动运行真空。在最简单的情况下,您可以有一个简单的 cron 作业,当您的数据库不经常访问时,这将在每晚进行一次全面清理
希望有帮助!