PostgreSQL数据库内核分析
目录 |
系统概述
- 初始化数据库:./initdb --no-locale -D ../data
- ./pg_ctl start -D ../data
- 数据库命令:initdb createuser dropuser createdb dropdb pg_dump pg_restore pg_ctl vacuumdb psql
- psql元命令:\? \o \l \q \c \dt \d \di \i (sql);
体系结构
- 主要系统表及其依赖关系
- pg_namespace(nspname, nspowner, nspacl)
- pg_tablespace(spcname, spcowner, spclocation, spcacl)
- pg_database
- pg_class
- pg_type
- pg_attribute
- pg_index
- 系统视图:pg_cursors pg_group pg_indexes pg_locks pg_roles pg_rules ...
- 数据集簇
- 表/索引:超过1G分裂,filenode.1 ...
- 如果有些属性药存储大数据,那么就会有关联的TOAST表
- PG_DATA中的子目录和文件:PG_VERSION base global pg_clog pg_tblspc ...
- postgres.bki
- initdb的执行过程
- 系统数据库:template1 template0 postgres
- 进程结构:Postmaster Postgres SysLogger PgStat AutoVacuum BgWriter WalWriter PgArch
- Postmaster
- MemoryContext
- GUC配置参数
- 信号处理:SIGHUP_handler pmdie reaper(清理退出的子进程)
- 辅助进程启动
- 辅助进程
- WalWriter:段编号从0开始,不能循环使用
- PgArch(WAL日志归档):直接调用shell命令?k
- Postgres
- exec_simple_query
- Postmaster
存储管理
- 外存管理:表文件、空闲空间、虚拟文件描述符(VFD)、大数据
- 8.2+ 可见性映射VM 空闲映射FSM
- 堆文件:表文件+元组之间不关联,{普通、临时、序列、TOAST}
- 物理结构:PageHeaderData Linp<N> ... Freespace .. Tuple<N> Special_space
- “HOT技术”
- 一条元组的每个版本都有对应版本的索引 ==〉... 标记删除
- 磁盘管理(SMGR)
- MdfdVec:vfd、segno、chain
- VFD机制
- LRU池(VfdCache)
- FSM
- p66 fp_next_slot
- fsm_search 最大堆二叉树?
- VM:作为一个提示加快VACUUM速度
- 大数据:
- TOAST:存储变长数据?如VARCHAR等,需超过2KB;线外/压缩2种存储机制
- LOB
- 内存管理
- MemoryContext:AllocSet
- 高速缓存:SysCache/RelCache
- 缓冲池
- IPC
- 表操作和元组操作
- 同步扫描(多个扫描时利用共享缓冲)
- VACUUM机制
- Lazy:标记无效为可用
- Full
- ResourceOwner资源跟踪
感觉这里的描述非常混乱
索引
- 索引方式
- 部分索引?CREATE INDEX idx ON student(name) WHERE (id>1 AND id<255);
- 表达式索引?CREATE INDEX idx ON student(lower(name))
- pg_am:每个元组包括了该索引类型提供的访问函数(pg_proc.oid)?
- B-Tree索引
- 每个非最右节点:High-Key
- BTWriteState:记录整个索引创建过程中的信息
- 对每一层生成一个BTPageState,其btps_next指向父节点(?)
- 填充因子:... WITH (fillfactor=70);
- 扫描索引
- Hash索引
- 4种页:meta(0#) bucket overflow(桶里的元素) bitmap(管理前两者的使用情况)
- GiST
- Consistent(E,q) Union(P) Same(E1,E2) Penalty(E1,E2) PickSplit(P) Compress(E) Decompress(E)
- GISTInsertStack?
- GIN
- compare、extractValue、extractQuery、consistent(类似于hashtable的equals?)、comparePartial
- TSearch2
查询编译
- 查询分析
- 查询重写
- 查询规划:查询树链表 => 执行计划链表
- 在路径生成过程中,每生成一个中间关系,要估算出大小、路径及代价
- DP、GA
- 基本关系访问路径
- 索引扫描路径
- TID(元组的物理地址?)
- 生成可优化的MIN/MAX聚集计划
- 生成普通计划
- 扫描:顺序/索引
- 连接:嵌套循环、Hash、归并
- 其他:Append、Result、物化
- 生成完整计划(+聚集/排序)
- 整理计划树
- 在路径生成过程中,每生成一个中间关系,要估算出大小、路径及代价
- 代价估计
- 遗传算法
查询执行
- 非可优化语句
- 可优化语句
- 计划节点
- 控制:Result Append BitmapAnd/Or RecursiveUnion
- 扫描:Seq Index BitmapHeap BitmapIndex Tid Subquery Function Values Cte WorkTable
- 物化:Material Sort Group Agg Unqiue Hash SetOp Limit WindowAgg
- 连接:类型(Inner Left/Right/Full_Outer Semi Anti)、操作
- 其他子功能
- 元组操作
- 表达式计算
- 投影
事务处理与并发控制
- TBlockState
- 2PC
- 3种锁
- SpinLock
- LWLock
- RegularLock
- 锁管理机制
- 死锁
- 等待图(WFG)
- MVCC(这里讲解似乎不够清晰)
- 日志管理:XLOG/CLOG
- SLRU缓冲池
- SUBTRANS日志管理器?
- MULTIXACT日志管理器:记录组合事务ID?
数据库安全
附录A 用Eclipse开发和调试
时间: 2024-10-25 06:47:47