您的位置:首页 > 理论基础 > 数据结构算法

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

2014-11-10 19:26 1071 查看

PostgreSQL数据库内核分析

跳转至:
导航、
搜索

目录

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

系统概述

初始化数据库:./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

存储管理

外存管理:表文件、空闲空间、虚拟文件描述符(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开发和调试

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐