微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

Postgresql数据库内核分析

目录

系统概述

  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开发和调试

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果是个PostGreSQL的数据,于是装数据库,但这个也不懂呀,而且本系统用的Oracle,于是得解决迁移转换的问题。 总结下来两个思路。1、PostgresToOracle多金的
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么查看PostgreSQL数据库中所有表”文章能帮助大...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正确。  pg_hba.conf文件在Postgre安装文件目录下的data文件夹中。解决方案1、进入到data目录下,找到pg_hba.conf文件
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本地localhost访问正常,在相同网段的远程机器访问报如下错误
wamp 环境 这个提示就是说你的版本低于10了。 先打印php_info(),查看自己的版本(我这边是已经处理后的,之前的忘记截图了)
psycopg2.OperationalError: SSL SYSCALL error: EOF detected 问题提示:exception psycopg2.OperationalError
项目 postgres 连接不上, 所有连接报错 :psql: FATAL: sorry, too many clients already问题原由程序使用连接未及时释放, 连接一直处于 idle 状态处理方式1、 程序里面未释放的连接, 在使用后及时释放
服务器在同一个数据目录上启动了两个PostgreSQL实例(它已经删除postmaster.pid并使用了新的端口号,因此绕过了这种行为的正常保护措施被绕过),导致PostgreSQL的误操作postgresql 报错 FATAL: the database system is
问题原因:数据库崩溃,内存不足造成 或者 数据已损坏,磁盘故障造成首先介绍一下背景,在测试Deepgreen(Greenplum升级版)数据库时,pgbench并发数设置过多,导致数据库卡死了,在进行连接、重启、关闭时,都报同样
第 11 届 PostgreSQL 中国技术大会于 2022 年 1 月 7 日至 9 日在武汉光谷会展酒店成功举办。作为 PostgreSQL 技术领域的年度盛事,postgreSQL 中文社区旨在搭建开放、合作共享的平台,基于开源,创新驱动,共同探讨数据库行业数字化发展方向和未来新机遇。