主要观点:
- 要理解
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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。