在PostgreSQL中启用autovaccum

环境

PostgreSQL12.4和Ubuntu20.4

首先

一旦开始运行PostgreSQL,就必须每天进行运维管理。特别重要的是VACUUM和ANALYZE。根据官方信息,自动VACUUM被强烈推荐使用。

吸尘器

当表格被多次更新或删除时,会导致被称为空闲的无用空间(称为元组)持续存在。为了清除PostgreSQL浪费的磁盘空间并避免磁盘容量不足,VACCUM功能可以实现这一点。PostgreSQL采用了被称为多版本并发控制(MVCC)的架构,这意味着在结构上无论如何都会产生元组。

如果有许多表格更新/删除操作,元组的容量将呈指数增长。当元组的容量增大时,会影响到对数据库的读取/写入速度。

在某个时机定期执行VACUUM操作,将膨大的数据库容量恢复到实际容量是必要的。这个功能类似于MS-Access数据库的优化。

执行VACCUM时不会对表施加排它锁,以确保不会影响用户访问。无需在深夜秘密执行,可以放心地在白天执行。

有一個類似於vacuum命令的命令,稱為vaccum full命令。vacuum命令不會對排他鎖進行處理,但vaccum full命令會對排他鎖進行處理。如果手動執行vaccum full命令,將會對用戶的訪問產生影響,因此必須避免在工作時間執行。自動的vacuum過程中,使用的是vacuum命令而不是vaccum full命令,請放心。vaccum full命令只能手動執行。

分析

ANALYZE是用来更新每个表的统计信息至最新状态的。为了加快表的查询响应速度,会创建索引,但如果统计信息过时,即使创建了索引,也无法获得相应的性能提升。

如果表的更新/删除频繁进行,统计信息的状态将与实际情况越来越脱节。通过使统计信息保持最新,可以加快Select语句的响应速度。如果最近觉得响应变慢了,应该执行ANALYZE。

当执行ANALYZE时,对表进行临时读取锁定,但不会进行排他锁定。由于执行ANALYZE不会导致用户响应速度降低,因此可以在白天堂皇地执行。

设定

VACUUM和ANAZYZE可以通过命令手动执行,也可以在PostgreSQL端进行自动化。要实现自动化,只需在postgresql.conf中设置下面两行参数即可。默认情况下,这两行参数都被注释掉了,只需要取消注释即可。

autovaccume = on
track_counts = on

启用自动吸尘功能后,ANALYZE也会自动执行。自动吸尘的守护程序已经开始引用统计信息,因此自然而然地也会流动ANALYZE。

如果启用自动吸尘程序,该程序将常驻运行。当任务阈值超过时,吸尘机将自动执行。

参数

根据公式手册的说明,执行VACCUM时,对于磁盘而言,会运行相当数量的I/O操作。如果磁盘空间充足,为了尽可能减少对响应的影响,应该尽量减少VACCUM运行的间隔。在启用自动清理之前,应该考虑一些参数。

自动执行清理的检查间隔。默认为1分钟。根据使用情况而定,如果您认为1分钟太短了,那么请将此设置延长。

autovacuum_naptime = 1min

这是设置执行 VACCUM 的阈值。阈值将使用以下公式计算:
“autovacuum_vacuum_threshold + autovacuum_vacuum_scale_factor × 记录数”

如果表中有100个数据,根据默认值的设置,那么结果将为70(50 + 0.2 × 100)。
如果数据有70个被更新/删除,那么将执行VACCUM操作。

如果表格中有1000条数据,并且默认值已经设置好的话,
50 + 0.2 × 1000 = 250。
如果有250条数据被更新/删除,那么VACCUM操作将被执行。

我个人认为这里的设置默认值是合理的。但是根据情况可能需要自定义调整。

autovacuum_vacuum_threshold     = 50
autovacuum_vacuum_scale_factor  = 0.2

请提供参考资料。

 

广告
将在 10 秒后关闭
bannerAds