首页 > 代码库 > PostgreSQL数据库内核分析 笔记(这本书没有怎么很好的看,主要就是一些数据结构、概念和流程的文字介绍)

PostgreSQL数据库内核分析 笔记(这本书没有怎么很好的看,主要就是一些数据结构、概念和流程的文字介绍)

PostgreSQL数据库内核分析

跳转至: 导航、 搜索

目录

  • 1系统概述
  • 2体系结构
  • 3存储管理
  • 4索引
  • 5查询编译
  • 6查询执行
  • 7事务处理与并发控制
  • 8数据库安全
  • 9附录A 用Eclipse开发和调试

系统概述

  1. 初始化数据库:./initdb --no-locale -D ../data
  2. ./pg_ctl start -D ../data
  3. 数据库命令:initdb createuser dropuser createdb dropdb pg_dump pg_restore pg_ctl vacuumdb psql
  4. psql元命令:\? \o \l \q \c \dt \d \di \i (sql);

体系结构

  1. 主要系统表及其依赖关系
    1. pg_namespace(nspname, nspowner, nspacl)
    2. pg_tablespace(spcname, spcowner, spclocation, spcacl)
    3. pg_database
    4. pg_class
    5. pg_type
    6. pg_attribute
    7. pg_index
  2. 系统视图:pg_cursors pg_group pg_indexes pg_locks pg_roles pg_rules ...
  3. 数据集簇
    1. 表/索引:超过1G分裂,filenode.1 ...
    2. 如果有些属性药存储大数据,那么就会有关联的TOAST表
    3. PG_DATA中的子目录和文件:PG_VERSION base global pg_clog pg_tblspc ...
    4. postgres.bki
    5. initdb的执行过程
    6. 系统数据库:template1 template0 postgres
  4. 进程结构:Postmaster Postgres SysLogger PgStat AutoVacuum BgWriter WalWriter PgArch
    1. Postmaster
      1. MemoryContext
      2. GUC配置参数
      3. 信号处理:SIGHUP_handler pmdie reaper(清理退出的子进程)
      4. 辅助进程启动
    2. 辅助进程
      1. WalWriter:段编号从0开始,不能循环使用
      2. PgArch(WAL日志归档):直接调用shell命令?k
    3. Postgres
    4. exec_simple_query

存储管理

  1. 外存管理:表文件、空闲空间、虚拟文件描述符(VFD)、大数据
    1. 8.2+ 可见性映射VM 空闲映射FSM
  2. 堆文件:表文件+元组之间不关联,{普通、临时、序列、TOAST}
    1. 物理结构:PageHeaderData Linp<N> ... Freespace .. Tuple<N> Special_space
    2. “HOT技术”
      1. 一条元组的每个版本都有对应版本的索引 ==〉... 标记删除
  3. 磁盘管理(SMGR)
    1. MdfdVec:vfd、segno、chain
  4. VFD机制
    1. LRU池(VfdCache)
  5. FSM
    1. p66 fp_next_slot
    2. fsm_search 最大堆二叉树?
  6. VM:作为一个提示加快VACUUM速度
  7. 大数据:
    1. TOAST:存储变长数据?如VARCHAR等,需超过2KB;线外/压缩2种存储机制
    2. LOB
  8. 内存管理
    1. MemoryContext:AllocSet
    2. 高速缓存:SysCache/RelCache
    3. 缓冲池
    4. IPC
  9. 表操作和元组操作
    1. 同步扫描(多个扫描时利用共享缓冲)
  10. VACUUM机制
    1. Lazy:标记无效为可用
    2. Full
  11. ResourceOwner资源跟踪

感觉这里的描述非常混乱

索引

  1. 索引方式
    1. 部分索引?CREATE INDEX idx ON student(name) WHERE (id>1 AND id<255);
    2. 表达式索引?CREATE INDEX idx ON student(lower(name))
  2. pg_am:每个元组包括了该索引类型提供的访问函数(pg_proc.oid)?
  3. B-Tree索引
    1. 每个非最右节点:High-Key
    2. BTWriteState:记录整个索引创建过程中的信息
    3. 对每一层生成一个BTPageState,其btps_next指向父节点(?)
    4. 填充因子:... WITH (fillfactor=70);
    5. 扫描索引
  4. Hash索引
    1. 4种页:meta(0#) bucket overflow(桶里的元素) bitmap(管理前两者的使用情况)
  5. GiST
    1. Consistent(E,q) Union(P) Same(E1,E2) Penalty(E1,E2) PickSplit(P) Compress(E) Decompress(E)
    2. GISTInsertStack?
  6. GIN
    1. compare、extractValue、extractQuery、consistent(类似于hashtable的equals?)、comparePartial
  7. TSearch2

查询编译

  1. 查询分析
  2. 查询重写
  3. 查询规划:查询树链表 => 执行计划链表
    1. 在路径生成过程中,每生成一个中间关系,要估算出大小、路径及代价
      1. DP、GA
      2. 基本关系访问路径
      3. 索引扫描路径
      4. TID(元组的物理地址?)
    2. 生成可优化的MIN/MAX聚集计划
    3. 生成普通计划
      1. 扫描:顺序/索引
      2. 连接:嵌套循环、Hash、归并
      3. 其他:Append、Result、物化
    4. 生成完整计划(+聚集/排序)
    5. 整理计划树
  4. 代价估计
  5. 遗传算法

查询执行

  1. 非可优化语句
  2. 可优化语句
  3. 计划节点
    1. 控制:Result Append BitmapAnd/Or RecursiveUnion
    2. 扫描:Seq Index BitmapHeap BitmapIndex Tid Subquery Function Values Cte WorkTable
    3. 物化:Material Sort Group Agg Unqiue Hash SetOp Limit WindowAgg
    4. 连接:类型(Inner Left/Right/Full_Outer Semi Anti)、操作
  4. 其他子功能
    1. 元组操作
    2. 表达式计算
    3. 投影

事务处理与并发控制

  1. TBlockState
  2. 2PC
  3. 3种锁
    1. SpinLock
    2. LWLock
    3. RegularLock
  4. 锁管理机制
  5. 死锁
    1. 等待图(WFG)
  6. MVCC(这里讲解似乎不够清晰)
  7. 日志管理:XLOG/CLOG
    1. SLRU缓冲池
    2. SUBTRANS日志管理器?
    3. MULTIXACT日志管理器:记录组合事务ID?

数据库安全

附录A 用Eclipse开发和调试 

PostgreSQL数据库内核分析 笔记(这本书没有怎么很好的看,主要就是一些数据结构、概念和流程的文字介绍)