Postgresql数据库内核分析
目录 |
系统概述
- 初始化数据库:./initdb --no-locale -D ../data@H_301_20@
- ./pg_ctl start -D ../data@H_301_20@
- 数据库命令:initdb createuser dropuser createdb dropdb pg_dump pg_restore pg_ctl vacuumdb psql@H_301_20@
- psql元命令:\? \o \l \q \c \dt \d \di \i (sql);@H_301_20@
体系结构
- 主要系统表及其依赖关系
- pg_namespace(nspname,nspowner,nspacl)@H_301_20@
- pg_tablespace(spcname,spcowner,spclocation,spcacl)@H_301_20@
- pg_database@H_301_20@
- pg_class@H_301_20@
- pg_type@H_301_20@
- pg_attribute@H_301_20@
- pg_index@H_301_20@
- 系统视图:pg_cursors pg_group pg_indexes pg_locks pg_roles pg_rules ...@H_301_20@
- 数据集簇
- 表/索引:超过1G分裂,filenode.1 ...@H_301_20@
- 如果有些属性药存储大数据,那么就会有关联的TOAST表@H_301_20@
- PG_DATA中的子目录和文件:PG_VERSION base global pg_clog pg_tblspc ...@H_301_20@
- postgres.bki@H_301_20@
- initdb的执行过程@H_301_20@
- 系统数据库:template1 template0 postgres@H_301_20@
- 进程结构:Postmaster Postgres SysLogger PgStat AutoVacuum BgWriter WalWriter PgArch
- Postmaster
- MemoryContext@H_301_20@
- GUC配置参数@H_301_20@
- 信号处理:SIGHUP_handler pmdie reaper(清理退出的子进程)@H_301_20@
- 辅助进程启动@H_301_20@
- 辅助进程 @H_301_20@
- Postgres@H_301_20@
- exec_simple_query@H_301_20@
- Postmaster
存储管理
- 外存管理:表文件、空闲空间、虚拟文件描述符(VFD)、大数据
- 8.2+ 可见性映射VM 空闲映射FSM@H_301_20@
- 堆文件:表文件+元组之间不关联,{普通、临时、序列、TOAST} @H_301_20@
- 磁盘管理(SMGR)
- MdfdVec:vfd、segno、chain@H_301_20@
- VFD机制
- LRU池(VfdCache)@H_301_20@
- FSM @H_301_20@
- VM:作为一个提示加快VACUUM速度@H_301_20@
- 大数据: @H_301_20@
- 内存管理 @H_301_20@
- 表操作和元组操作
- 同步扫描(多个扫描时利用共享缓冲)@H_301_20@
- VACUUM机制 @H_301_20@
- ResourceOwner资源跟踪@H_301_20@
感觉这里的描述非常混乱
索引
- 索引方式
- 部分索引?CREATE INDEX idx ON student(name) WHERE (id>1 AND id<255);@H_301_20@
- 表达式索引?CREATE INDEX idx ON student(lower(name))@H_301_20@
- pg_am:每个元组包括了该索引类型提供的访问函数(pg_proc.oid)?@H_301_20@
- B-Tree索引
- 每个非最右节点:High-Key@H_301_20@
- BTWriteState:记录整个索引创建过程中的信息@H_301_20@
- 对每一层生成一个BTPageState,其btps_next指向父节点(?)@H_301_20@
- 填充因子:... WITH (fillfactor=70);@H_301_20@
- 扫描索引@H_301_20@
- Hash索引 @H_301_20@
- GiST
- Consistent(E,q) Union(P) Same(E1,E2) Penalty(E1,E2) PickSplit(P) Compress(E) Decompress(E)@H_301_20@
- GISTInsertStack?@H_301_20@
- GIN
- compare、extractValue、extractQuery、consistent(类似于hashtable的equals?)、comparePartial@H_301_20@
- TSearch2@H_301_20@
查询编译
- 查询分析@H_301_20@
- 查询重写@H_301_20@
- 查询规划:查询树链表 => 执行计划链表
- 在路径生成过程中,每生成一个中间关系,要估算出大小、路径及代价 @H_301_20@
- 生成可优化的MIN/MAX聚集计划@H_301_20@
- 生成普通计划 @H_301_20@
- 生成完整计划(+聚集/排序)@H_301_20@
- 整理计划树@H_301_20@
- 代价估计@H_301_20@
- 遗传算法@H_301_20@
查询执行
- 非可优化语句@H_301_20@
- 可优化语句@H_301_20@
- 计划节点
- 控制:Result Append BitmapAnd/Or RecursiveUnion@H_301_20@
- 扫描:Seq Index BitmapHeap BitmapIndex Tid Subquery Function Values Cte WorkTable@H_301_20@
- 物化:Material Sort Group Agg Unqiue Hash SetOp Limit WindowAgg @H_301_20@
- 连接:类型(Inner Left/Right/Full_Outer Semi Anti)、操作@H_301_20@
- 其他子功能 @H_301_20@
事务处理与并发控制
- TBlockState@H_301_20@
- 2PC@H_301_20@
- 3种锁 @H_301_20@
- 锁管理机制@H_301_20@
- 死锁
- 等待图(WFG)@H_301_20@
- MVCC(这里讲解似乎不够清晰)@H_301_20@
- 日志管理:XLOG/CLOG @H_301_20@