PostgreSQL Files 和 Forks 概念

在 PostgreSQL 数据库中,relation 关联的所有信息存储在几个不同的 forks 里面,每个 fork 都包含一个特定类型的数据。首先一个 fork 表示一个文件,它的文件名由一个数字 ID(oid)表示,可以通过对应于 fork 类型的后缀进行扩展。

文件随着时间的推移而增长,当文件的大小超过 1 GB时,这个类型的 fork 的另外一个文件就会被创建,这样的文件有时也称之为段文件,段文件的序列号被添加到这个文件的末尾。文件大小 1 GB 的限制是为了支持历史上某些文件系统而创建的,这些古老的文件系统不支持大型文件,当然目前已经很少使用这些古老的文件系统了,可以在编译时指定 --with-segsize 参数修改这一限制。

一个单表在磁盘上由多个文件组成,即使一个没有任何索引的小表也至少包含 3 个文件。

每个表空间目录(不包含 pg_global)对于每个数据库都有其对应的独立子目录,同一个表空间同一个数据库中的所有对象存储在同一个子目录中,必须要注意文件系统可能无法很好地处理单个目录中的太多文件。

有几种标准类型的 forks,如下:

  • main fork,代表实际数据,表行数据或者表索引数据,任何 relation 都包含 main fork,除了没有数据的视图。main fork 的文件由数字 ID 命名,存储在 pg_class 表的 relfilenode 字段。
  • initialization fork,出现在 unlogged 表以及 unlogged 表的索引。因为 unlogged 表在崩溃后不能恢复一致性数据,因此 PG 只是简单的删除这个对象的所有 forks,然后使用 initialization fork 覆盖 main fork。
  • free space map,用来跟踪页面的可用空间,它的体积不断变化,在 vacuum 后不断增长,当新的行版本出现,它又不断变小。free space map 用于 insert 数据时快速地找到一个合适的页面。free space map 文件名前缀为 _fsm,初始条件下该文件并不存在,它只在需要时才创建,可以在 vacuum 一张表后找到该文件。
  • visibility map,用来快速判断一个页面是否需要 vacuum 或者 frozen,对于每个表数据页,visibility map 提供 2 个 bit 位来跟踪可见性信息。visibility map 文件前缀为 _vm,它只对表提供,索引没有 visibility map。

文章评论

0条评论