Reading the internals of Postgres: Database cluster, databases, and tables
13 days ago
- #PostgreSQL
- #Storage
- #Database Internals
- PostgreSQL使用“数据库集群”来指代管理多个数据库的单个实例,而非多个服务器。
- 数据库和其他对象通过OID(无符号整数)标识,用户创建对象的OID从16384开始。
- 像pg_class和pg_database这样的系统目录存储元数据,是可查询的常规表。
- 物理结构以数据目录($PGDATA)为中心,包含按OID命名的每个数据库的子目录和表。
- 表和索引存储在base/{数据库OID}/{关系文件节点}下的文件中,具有空闲空间和可见性映射的分叉。
- VACUUM FULL可以更改表的relfilenode,使其与OID解耦。
- 表空间允许将数据库对象存储在自定义目录中,在$PGDATA/pg_tblspc/中有符号链接。
- 堆表由包含页头、行指针的8KB页组成,元组从页面末尾开始存储。
- TOAST通过将大值存储在单独的外部表中(分块并索引)来处理它们。
- 写入元组涉及更新页头和行指针,并考虑对齐问题。
- 读取元组可使用顺序扫描或索引扫描(例如B树),具体取决于查询。