Hans-Juergen Schoenig:VACUUM:管理和检测膨胀

Hans-Juergen Schoenig:VACUUM:管理和检测膨胀

💡 原文英文,约3400词,阅读约需13分钟。
📝

内容提要

本文介绍了PostgreSQL中VACUUM的概念、重要性以及实施有效的清理策略的最佳实践。VACUUM的作用是清理不再被任何活动事务看到的行,还介绍了VACUUM FULL的问题和解决方法,以及如何检测表的膨胀情况。最后,文章提到了使用FILLFACTOR来优化UPDATE操作的性能。

🔎

延伸解读

长事务如何阻碍VACUUM清理

文章通过事务示例说明,VACUUM只能清理不再被任何活动事务看到的行。如果存在长事务或长时间空闲的事务,VACUUM虽然运行,但无法移除这些行,导致表膨胀持续。因此,监控并消除长事务是保证VACUUM有效性的关键。

VACUUM不释放空间给操作系统

文章用实验表明,普通VACUUM仅将死元组占用的空间标记为可用,但不会将空间返还给文件系统,表文件大小不变。这些空间会被后续插入或更新重用。因此,除非需要收缩表,否则不必频繁使用VACUUM FULL,因为它需要表锁,可能造成停机。

检测膨胀:pgstattuple与近似方法

文章介绍使用pgstattuple扩展检测表膨胀,它输出表大小、元组数量、死元组和空闲空间等详细信息。但全表扫描对大表代价高,此时可用pgstattuple_approx抽样估算。文章还提供了一个查询,利用LATERAL对数据库中所有非系统表进行批量检测,并按表大小排序。

FILLFACTOR:控制膨胀以优化UPDATE

文章指出,并非所有膨胀都有害。对于频繁UPDATE的表,通过设置FILLFACTOR(如60-80)在块中预留空间,可使更新后的行版本尽量留在同一块内,减少磁盘I/O。实验显示,当块内有空闲空间时,更新只需修改一个块,而非两个。因此,合理控制膨胀能提升性能。

❓

Q&A

VACUUM在PostgreSQL中的作用是什么?

VACUUM用于清理不再被任何活动事务看到的行,以保持数据库的效率和性能。

为什么VACUUM不会将空间返回给操作系统?

VACUUM不会将空间返回给操作系统,因为它只会清理行而不会移动数据,空间会被标记为可用,但不会释放给操作系统。

VACUUM FULL有什么问题?

VACUUM FULL需要表锁,可能导致数据库停机,因此在许多情况下不推荐频繁使用。

如何检测PostgreSQL表的膨胀情况?

可以使用pgstattuple扩展来检测表的膨胀情况,pgstattuple_approx提供了更快的近似结果。

FILLFACTOR在优化UPDATE操作中有什么作用?

FILLFACTOR可以优化UPDATE操作的性能,通过在块中留出空间,减少I/O操作。

pg_squeeze工具的优势是什么?

pg_squeeze是一个开源工具,可以在不阻塞写入的情况下重组表,避免VACUUM FULL带来的停机问题。

🏷️

标签

➡️

继续阅读