PostgreSQL vacuum功能详解
PostgreSQL 中的
VACUUM是一个非常重要的功能,主要用于回收数据库中已删除或更新行所占用的空间,以及更新数据库的统计信息,以下是其详细介绍:作用
- 回收空间:当在 PostgreSQL 中执行
DELETE操作或者对变长数据类型进行UPDATE操作时,被删除或更新的行所占用的空间并不会立即释放,而是标记为可重用。VACUUM命令会扫描表,将这些已标记为可重用的空间真正释放,以便后续的插入或更新操作可以重新使用这些空间,从而避免数据库文件不断膨胀。 - 更新统计信息:
VACUUM会收集和更新关于表中数据分布的统计信息,例如每个列不同值的数量、空值的数量等。这些统计信息对于查询优化器非常重要,查询优化器会根据这些信息来选择最优的查询执行计划,从而提高查询性能。 - 清理事务可见性信息:在 PostgreSQL 中,每个事务都有一个事务 ID。行数据包含了与事务可见性相关的信息,用于判断哪些事务可以看到哪些数据。随着时间的推移和事务的不断执行,这些事务可见性信息可能会变得非常庞大和复杂。
VACUUM会清理这些不再需要的事务可见性信息,以减少系统开销并提高性能。
工作原理
- 标记删除行:在对表执行
DELETE操作时,实际上并不会立即从物理存储中删除相应的行,而是在该行上设置一个删除标记,将其标记为已删除。 - 扫描表:
VACUUM命令会对表进行顺序扫描,检查每一行是否被标记为删除。如果发现被标记为删除的行,并且该行所占用的空间可以安全地回收(例如,没有其他事务可能还需要访问该行),则将该行从物理存储中移除,并释放其所占用的空间。 - 更新统计信息:在扫描表的过程中,
VACUUM会收集关于表中数据的各种统计信息,例如每行的大小、列中不同值的数量等,并将这些统计信息更新到系统目录中。
操作类型
- 普通
VACUUM:只会回收空间和更新统计信息,不会对索引进行处理。执行命令为VACUUM [VERBOSE] [table_name],其中VERBOSE参数可选,用于显示详细的操作信息,table_name也可选,若不指定则会对所有表进行VACUUM操作。 VACUUM FULL:不仅会回收空间和更新统计信息,还会对表进行重写,将表中的数据重新组织,以达到更好的空间利用效果,但这个操作会比较耗时,并且在操作过程中会对表加排他锁,阻止其他事务对表的读写操作。执行命令为VACUUM FULL [VERBOSE] [table_name]。VACUUM ANALYZE:ANALYZE子句用于收集和更新更详细的统计信息,以便查询优化器做出更准确的查询计划。可以单独使用ANALYZE命令,也可以结合VACUUM一起使用,即VACUUM ANALYZE [VERBOSE] [table_name]。
自动VACUUM
PostgreSQL 有自动
VACUUM机制,由autovacuum守护进程负责。它会根据系统参数和数据库的活动情况自动触发VACUUM操作。相关的主要参数有:autovacuum:该参数用于启用或禁用自动VACUUM功能,默认值为on。autovacuum_naptime:指定自动VACUUM守护进程检查是否需要进行VACUUM操作的时间间隔,默认值是 1 分钟。autovacuum_vacuum_threshold:指定表中需要进行VACUUM操作的最小元组数,默认值是 50。
使用场景与注意事项
- 使用场景:当发现数据库文件增长过快,或者查询性能因为统计信息不准确而下降时,就需要考虑手动执行
VACUUM操作。对于频繁进行数据插入、删除和更新的表,定期执行VACUUM可以有效地维护数据库的性能和空间利用率。 - 注意事项:
VACUUM FULL操作会对表加排他锁,可能会阻塞其他事务的读写操作,因此建议在数据库空闲时间段执行。另外,虽然自动VACUUM可以减轻管理员的负担,但对于一些特殊的业务场景或大表,可能还需要根据实际情况手动调整VACUUM的执行策略和参数。
浙公网安备 33010602011771号