本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
自动清理和分析表格
Autov ac uum 是一个守护程序(也就是说,它在后台运行),它会自动清理(清理)死元组,回收存储空间并收集统计信息。它会检查数据库中是否有膨胀的表,并清除膨胀表以重用空间。它监视数据库表和索引,并在它们达到更新或删除操作的特定阈值后将其添加到 vacuum 作业中。
Autovacuum 通过自动执行 Post VACUUM
greSQL 和命令来管理真空。ANALYZE
VACUUM
从表中移除膨胀并回收空间,同时ANALYZE
更新统计信息,使优化器能够制定有效的计划。 VACUUM
还执行一项名为 vacuu m 冻结的主要任务,以防止数据库中出现事务 ID 环绕问题。数据库中更新的每一行都会从 PostgreSQL 事务控制机制接收一个事务 ID。这些 ID 控制该行对其他并发事务的可见性。交易 ID 是一个 32 位的数字。二十亿个身份证总是保存在可见的过去。其余(约22亿)的ID保留用于将来将要发生的交易,并且隐藏在当前交易之外。PostgreSQL 需要偶尔清理和冻结旧行,以防止事务在创建新事务时绕过并使旧的现有行不可见。有关更多信息,请参阅 PostgreSQL 文档中的防止事务 ID 重现故障
建议使用自动吸尘器,默认情况下处于启用状态。其参数包括以下内容。
参数 |
描述 |
亚马逊 RDS 的默认设置 |
Aurora 的默认值 |
|
在自动清理表之前,必须对表执行的最少元组更新或删除操作次数。 |
50 次操作 |
50 次操作 |
|
在 autovacuum 分析表之前,必须对表进行的最小元组插入、更新或删除次数。 |
50 次操作 |
50 次操作 |
|
在 autovacum 清理表之前,必须对其进行修改的元组的百分比。 |
0.2% |
0.1% |
|
在 autovacum 分析表之前,必须对其进行修改的元组的百分比。 |
0.05% |
0.05% |
|
清空表之前冻结 ID 的最大有效期,以防止事务 ID 环绕问题。 |
2 亿笔交易 |
2 亿笔交易 |
Autovacuum 会根据特定的阈值公式列出要处理的表,如下所示。
-
在桌子
VACUUM
上运行的阈值:vacuum threshold = autovacuum_vacuum_threshold + (autovacuum_vacuum_scale_factor * Total row count of table)
-
在桌子
ANALYZE
上运行的阈值:analyze threshold = autovacuum_analyze_threshold + (autovacuum_analyze_scale_factor * Total row count of table)
对于中小型表,默认值可能就足够了。但是,经常修改数据的大表会有更多的死元组。在这种情况下,autovacuum 可能会经常处理表以进行维护,而其他表的维护可能会被延迟或忽略,直到大表完成为止。为避免这种情况,您可以调整下一节中描述的自动真空参数。
自动清理内存相关参数
autovacuum_max_workers
指定可以同时运行的自动真空进程(自动真空启动器除外)的最大数量。只有在启动服务器时才能设置此参数。如果 autovacuum 进程正忙于处理大型表,则此参数有助于清理其他表。
maintenance_work_mem
指定维护操作(例如VACUUM
CREATE INDEX
、和)使用的最大内存量ALTER
。在 Amazon RDS 和 Aurora 中,使用公式根据实例类分配内存GREATEST({DBInstanceClassMemory/63963136*1024},65536)
。autovacuum 运行时,最多可以分配计算值的autovacuum_max_workers
次数,因此请注意不要将该值设置得太高。要控制这一点,你可以autovacuum_work_mem
单独设置。
autovacuum_work_mem
指定每个 autovacum 工作进程使用的最大内存量。此参数默认为 -1,表示应maintenance_work_mem
改用值。
有关自动真空内存参数的更多信息,请参阅 Amazon RDS 文档中的为自动清理分配内存。
调整自动吸尘参数
用户可能需要根据其更新和删除操作调整自动真空参数。可以在表、实例或集群级别上设置以下参数的设置。
集群或实例级别
举个例子,让我们来看一个银行数据库,其中需要持续的数据操纵语言 (DML) 操作。为了维护数据库的运行状况,您应该在 Aurora 的集群级别和 Amazon RDS 的实例级别调整自动真空参数,并对读取器应用相同的参数组。在故障转移的情况下,应将相同的参数应用于新的写入器。
表格级别
例如,在食品配送数据库中,需要对名为的单个表进行持续的 DML 操作orders
,则应考虑使用以下命令在表级别调整autovacuum_analyze_threshold
参数:
ALTER TABLE <table_name> SET (autovacuum_analyze_threshold = <threshold rows>)
在表格级别使用积极的自动真空设置
由于默认的 autovacuum 设置,具有持续更新和删除操作的示例orders
表将成为清理的候选表。这会导致计划生成不当和查询缓慢。清除膨胀和更新统计数据需要表级的积极自动吸尘设置。
要确定设置,请跟踪在此表上运行的查询持续时间,并确定导致计划更改的 DML 操作的百分比。该pg_stat_all_table
视图可帮助您跟踪插入、更新和删除操作。
假设每当 5% 的orders
表发生变化时,优化器就会生成错误的计划。在这种情况下,应将阈值更改为 5%,如下所示:
ALTER TABLE orders SET (autovacuum_analyze_threshold = 0.05 and autovacuum_vacuum_threshold = 0.05)
提示
请谨慎选择积极的自动吸尘设置,以避免大量消耗资源。
有关更多信息,请参阅下列内容:
-
自动清理(Postg
reSQL 文档)
为了确保 autovacuum 有效运行,请定期监视死行、磁盘使用情况以及上次自动真空或ANALYZE
运行的时间。该pg_stat_all_tables
视图提供有关每个表 (relname
) 以及表中有多少死元组 (n_dead_tup
) 的信息。
监控每个表中死元组的数量,尤其是在经常更新的表中,可以帮助您确定自动清理过程是否定期删除死元组,以便可以重复使用它们的磁盘空间以提高性能。您可以使用以下查询来检查死元组的数量以及表上最后一次自动真空运行的时间:
SELECT relname AS TableName,n_live_tup AS LiveTuples,n_dead_tup AS DeadTuples, last_autovacuum AS Autovacuum,last_autoanalyze AS AutoanalyzeFROM pg_all_user_tables;
优点和局限性
自动吸尘器具有以下优点:
-
它会自动消除表格中的膨胀。
-
它可以防止交易 ID 环绕。
-
它使数据库统计数据保持最新。
限制:
-
如果查询使用并行处理,则工作进程的数量可能不足以实现自动真空。
-
如果 autovacuum 在高峰时段运行,则资源利用率可能会增加。你应该调整参数来处理这个问题。
-
如果表格页面被另一个会话占用,autovacuum 可能会跳过这些页面。
-
Autovacuum 无法访问临时表。