一:数据库集簇等等

1.2数据库集簇的物理结构

  • 数据库集簇在本质上是文件目录
    • 即基础目录
    • 包含一系列子目录与文件

数据库集簇里面有好多个数据库,在这个目录里面的base目录下,有很多数据库。

一:数据库集簇等等一:数据库集簇等等
  • initdb在指定目录下创建基础目录
    • 从而初始化一个新的数据库集簇
  • 基础目录的路径会被配置到环境变量$PGDATA
    • 不必要

  • 图1.2
    • 一个Postgresql数据库集簇
    • base每一个子目录都对应一个数据库
      • 每个表和索引都至少在相应子目录下存储为一个文件
    • 还有几个包含特定数据的子目录
    • 及配置文件
    • 例如postgresql.conf
  • Pg支持表空间,但该术语含义与其他RDBMS不同
  • Pg中的表空间对应一个包含基础目录之外数据的目录
一:数据库集簇等等

  • 后续描述数据库集簇的布局、
    • 数据库布局、
    • 表和索引相关文件的布局,
    • 及表空间的布局

1.2.1数据库集簇的布局

  • 官方文档描述数据库集簇布局
一:数据库集簇等等一:数据库集簇等等

1.2.2数据库布局

  • 一个数据库与base下的一个子目录对应,且该子目录的名称与相应数据库的oid相同。
  • 数据库sampledb的oid为16384时,它对应的子目录名称就是16384
一:数据库集簇等等一:数据库集簇等等

1.3堆表文件的内部布局

  • 数据文件(堆表、索引,也包括空闲空间映射和可见性映射)
    • 内部被划分为固定长度的页
    • 或叫区块,默认(8KB)
  • 每个文件中的页从0按顺序编号,称区块号
  • 如果文件已填满, Pg就通过在文件末尾追加一个新的空页来增加文件长度。
  • 页面内部布局取决于文件类型。
  • 本节描述表的页面布局
    • 图1.4
    • 堆表文件的页面布局

一:数据库集簇等等

  • 表的页面含了三种类型数据
  • 堆元组
    • 数据记录本身。
    • 它们从页面底部依序堆叠。
    • 5.2节与第9章描述元组内部结构,
      • 对于理解Pg并发控制与WAL机制必备的
  • 行指针
    • 每个行指针占4B,
    • 保存着指向堆元组的指针。
    • 也被称为项目指针。
    • 行指针形成一个简单数组,扮演元组索引的角色。
    • 每个索引项从1开始依次编号,称为偏移号
    • 当向页面中添加新元组时,一个相应的新行指针也会被放入数组,并指向新添加的元组

就是那里的1,2啊!!看到了吧!

  • 首部数据
    • 分配了由结构PageHeaderData定义的首部数据
    • 24B
    • pdlsn
      • 本页面最近一次变更所写入的XLOG记录对应的LSN
      • 8B无符号整,与WAL机制相关,9章将详细
    • pd_checksum
      • 页面的校验和值。(9.3或更高版本中才有此变量,早期该字段用于存储页面时间线标识)
    • pd_lower、pd_upper
      • 指向行指针末尾
      • 指向最新堆元组起始位置
      • pd_special
        • 索引页中用到该字段,堆表页中它指向页尾
        • (索引页中它指向特殊空间起始位置,
        • 特殊空间是仅由索引使用的特殊数据区域,
        • 含特定数据,具体内容依索引类型而定,如B树、GiST、GiN等。)