如果启用了autovacuum,是否应该手动对PostgreSQL数据库进行VACUUM?


15

我使用的软件可以创建一个大型的PostgreSQL数据库(其中有一个包含一百万行的表),而开发人员则说我应该VACUUMANALYZE定期这样做。但是PostgreSQL数据库默认设置是autovacuum打开的。

我应该完全吸尘/分析吗?有什么好处?自动和手动吸尘有什么区别

例如,在Pgadmin3中,我有这个:
在此处输入图片说明

Answers:


12

我同意ETL的说法,没有简短的答案。大小不是唯一重要的事情-我们在重负载下运行相当大的PostgreSQL OLTP数据库(某些表> 100.000.000行),当前我们仅依赖于autovacuum。

但是,对我来说,有两件事很重要:

  • 似乎已经达成共识,除非您在数据库上有非常明确的工作负载并且您确切知道自己在做什么,否则永远都不应关闭自动真空。但是,自然地,您可以执行其他操作VACUUM和/或ANALYZE运行。

  • 在考虑其他VACUUM运行之前,我将检查自动真空度如何保持。您可以通过查询pg_stat_user_tables和检查是否有任何表超出自动清空阈值pg_class。我在另一个可能感兴趣的线程上发布了这样的查询:PostgreSQL上的Aggressive Autovacuum

    不幸的是,对自动分析阈值进行类似的检查并不容易(即目前尚不可能)。但是,默认情况下,自动分析会在自动抽真空之前启动很长时间,而且便宜得多。因此,基本上,如果您的数据库可以跟上自动清理的步伐,那么使用自动分析也可以。也可以从查询最后的自动分析日期pg_stat_user_tables

我发现(最出色的)PostgreSQL文档的某些部分对您有所帮助:


7

除非您配置错误,否则Autovacuum应该会很好地覆盖它。其他答案已经涵盖了这一点。

尽管有一个明确定义的手动 情况VACUUM(更重要的是:manual ANALYZE):临时表,autovacuum守护程序不考虑它们。我CREATE TABLE这里引用手册

自动清理守护程序不能访问,因此不能真空或分析临时表。因此,应通过会话SQL命令执行适当的清理和分析操作。例如,如果要在复杂查询中使用临时表,明智的做法ANALYZE是在填充后在临时表上运行。



1

我认为您无需手动清理,除非您开始看到性能下降。但是,我强烈建议您检查一下真空度和自动真空度设置,并根据需要进行调整

要查看当前设置,请运行以下查询:

SELECT *
FROM pg_settings 
WHERE name LIKE '%vacuum%'

大多数字段是不言自明的,但是这里是有关它们的文档:https : //www.postgresql.org/docs/current/static/runtime-config-autovacuum.html

我要说的是,您的目标应该是配置autovacuum以始终如一地清理垃圾,但不要一直运行autovacuum

最重要的设置是:

  • autovacuum_vacuum_scale_factor-确定在触发清理之前可以死亡的元组的百分比。默认值= 0.2
  • autovacuum_vacuum_threshold-触发清除之前的最小元组数目。默认值= 50

阈值有助于防止对于小表而言过于频繁地触发清理过程。

除非您的表很大,否则默认设置可以正常工作。简而言之,如果您碰巧拥有占用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作业,当您的数据库不经常访问时,它将在每晚进行一次完整清理

希望有帮助!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.