一:数据库集簇等等
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等。)