主要观点:
- 要理解
VACUUM及其影响,需先了解数据在磁盘上的存储方式,重点关注Postgres。 - 数据库中的元组(tuple)是表的行版本和索引条目,由头(header)和数据(data)组成,页面(page)是固定大小的存储单元,包含头、元组指针数组、空闲空间等。
Postgres的TOAST技术用于存储超过 8KiB 的元组,较大列会存储在单独的表中。Postgres中有两种VACUUM操作,VACUUM基本形式仅删除表中的死元组版本,不回收空间;VACUUM FULL更激进,会删除死元组并回收空间,是阻塞操作。VACUUM过程分为多个阶段,包括堆扫描、索引清理、堆清理和堆截断等。- 普通
VACUUM操作在堆截断阶段会获取ACCESS EXCLUSIVE锁,可通过设置vacuum_truncate参数等方式避免或处理。
关键信息:
Postgres中单个页面大小为 8KiB,包含多种元素。- 元组的
t_xmin是插入事务,t_xmax是更新或删除事务。 - 可通过
pageinspect扩展查看数据库页面,heap_page_items函数查看页面项。 TOAST表用于存储大元组,有对应的主表和pg_toast表。VACUUM FULL会回收死元组空间,普通VACUUM不回收。VACUUM各阶段的作用及ACCESS EXCLUSIVE锁的获取情况和处理方式。
重要细节:
- 展示了创建表、插入数据、更新和删除数据后页面项的变化及
VACUUM操作的效果。 - 提供了用于识别大元组、获取表
oid等的查询语句及相关示例。 - 提及在有运行作业可能大量更新或删除行时,应禁用
VACUUM中的TRUNCATE选项以避免影响生产流量。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。