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 ...
- 数据集簇
- 进程结构:Postmaster Postgres SysLogger PgStat AutoVacuum BgWriter WalWriter PgArch
存储管理
- 外存管理:表文件、空闲空间、虚拟文件描述符(VFD)、大数据
- 8.2+ 可见性映射VM 空闲映射FSM
- 堆文件:表文件+元组之间不关联,{普通、临时、序列、TOAST}
- 磁盘管理(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
查询编译
查询执行
- 非可优化语句
- 可优化语句
- 计划节点
- 控制: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?