【读书笔记】《PostgreSQL指南-内幕探索》-1.数据库集簇、数据库和数据表

1.数据库集簇、数据库和数据表

数据库集簇的逻辑结构

它是一组数据库的集合,由一个Postgresql服务器管理。

--db oid
select datname,oid from pg_database;
--object oid
select relname,oid from pg_class;

数据库集簇的物理结构

本质上就是一个文件目录,即基础目录,包含一系列子目录与文件。执行initdb命令会在指定目录下创建基础目录。

文件 描述
PG_VERSION 包含PG主版本号
pg_hba.conf 控制Pg客户端认证
pg_ident.conf 控制pg用户名映射
postgresql.conf 配置参数
postgresl.auto.conf 存储使用alter system修改的配置参数
postmater.opts 记录服务器上次启动的命令行选项
base/ 每个数据库对应的子目录都存储在此
global 数据库集簇范畴的表(例如pg_database)及pg_control文件
pg_commit_ts/ 事务提交状态数据(9.6及以下),10之后被重命名为pg_xact
pg_dynshmem 动态共享内存子系统中使用的文件(9.4及更高)
pg_logical/ 逻辑解码的状态数据(9.4及更高)
pg_multixact/ 多事务状态数据
pg_notify/ LISTEN/NOTIFY状态数据
pg_repslot/ 复制槽数据(9.4及更高)
pg_serial/ 已提交的可串行化事务相关信息(9.1及更高)
pg_snapshots/ 导出快照(9.2及更高),pg函数pg_export_snapshot在此目录中创建快照信息文件
pg_stat 统计子系统的永久文件
pg_stat_tmp 统计子系统的临时文件
pg_subtrans/ 子事务状态数据
pg_tblspc/ 指定表空间的符号链接
pg_twophase/ 两阶段事务的状态文件
pg_wal/(10.0+) WAL段文件(10.0或更高),从pg_xlog重命名而来
pg_xact/(10+) 事务提交状态数据,从pg_clog重命名而来
pg_xlog/(9.6-) WAL段文件,10.0被重命名为pg_wal
--返回关系对于的文件路径
select pg_relation_filepath('sampletbl');
select relname,oid,relfilenode from pg_class where relname='sampletbl';
--索引和表文件大小单个最大1g,--with-segsize 可更改索引和表的最大文件大小
--_fsm 空间映射文件
--_vm 可见性映射文件
  • 关于表空间布局

--执行create tablespace 指定目录创建表空间,new_tblspc
--实际路径/home/postgres/tblspc
--软连接 ls -l $PGDATA/pg_tblspc
--指定表空间
create table newtb1 (...) tablespace new_tblspc;

堆表文件的内部布局

数据文件(堆表、索引,也包括空闲空间映射和可见性映射)内部被划分为固定长度的页,或者叫区块,大小默认是8KB。

表的页面包含了三种类型的数据
  1. 堆元组,即数据记录本身。
  2. 行指针,每个行指针占4B,保存着指向堆元组的指针。
  3. 首部数据,页面起始位置分配了由结构PageHeaderData定义的首部数据。大小24B,页面的元数据。结构主要成员变量如下:
    • pd_lsn,本页最近一次变更所写入的xlog记录对应的LSN。
    • pd_checksum,本页面的校验和值
    • pd_lower,pd_upper,指向行指针的末尾,后者指向最新堆元组的起始位置。
    • pd_special,在索引页中会用到该字段。在堆表页中它指向尾页。

为了识别表中的元组,数据库内部会使用元组标识符(tuple identifier,TID).由一对值组成,分别是元组所属页面的区块号和指向元组的行指针的偏移号。

读写元组的方式

  • 顺序扫描,通过扫描每一页中的行指针,依序读取所有页面中的所有元组
  • B树索引扫描,索引文件包含索引元组,索引元组由一个键值对组成,键为被索引的列值,值为目标堆元组的TID。
--tid扫描,表中找到第0个页面中的第一个元组
select ctid,data from sampletbl where ctid='(0,1)';
请使用浏览器的分享功能分享到微信等