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

时间: 2024-10-25 06:47:47

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

Linux内核分析笔记

我在MOOC<Linux内核分析>的学习笔记,这里只做个索引! 计算机是如何工作的

Linux内核分析 笔记三 构造一个简单的Linux系统MenuOS ——by王玥

一.知识点总结 (一)Linux源代码简介 arch/x86目录下的代码是我们重点关注的 内核启动相关代码都在init目录下 start_kernel函数相当于普通C程序的main函数 linux的核心代码都在kernel目录中 arch/ 支持不同cpu的源代码 Documentations/ 文档存储 init/ 内核启动相关代码 kenerl/ 进程调度相关代码 ipc/ 进程间通信 lib/ 公共库文件 mm/ 内存管理相关的代码 (二)构造一个简单的Linux系统 启动MenuOS系统

linux内核分析笔记----上半部与下半部(下)

接着上节的来,我们在上节说了软中断和tasklet,那这最后就是工作队列了哦.. 工作队列和前面讨论的其他形式都不相同,它可以把工作推后,交由一个内核线程去执行----该工作总是会在进程上下文执行.这样,通过工作队列执行代码能占尽进程上下文的所有优势,最重要的就是工作队列允许重新调度甚至是睡眠.相比较前边两个,这个选择起来就很容易了.我说过,前边两个是不允许休眠的,这个是允许休眠的,这就很明白了是不?这意味着在你需要获得大量内存的时候,在你需要获取信号量时,在你需要执行阻塞式的I/O操作时,它都

[转]linux内核分析笔记----内存管理

转自:http://blog.csdn.net/Baiduluckyboy/article/details/9667933 内存管理,不用多说,言简意赅.在内核里分配内存还真不是件容易的事情,根本上是因为内核不能想用户空间那样奢侈的使用内存. 先来说说内存管理.内核把物理页作为内存管理的基本单位.尽管处理器的最小可寻址单位通常是字,但是,内存管理单元MMU通常以页为单位进行处理.因此,从虚拟内存的交代来看,页就是最小单位.内核用struct  page(linux/mm.h)结构表示系统中的每个

[转帖]Greenplum :基于 PostgreSQL 的分布式数据库内核揭秘 (上篇)

Greenplum :基于 PostgreSQL 的分布式数据库内核揭秘 (上篇) https://www.infoq.cn/article/3IJ7L8HVR2MXhqaqI2RA 学长的文章.. 姚延栋 阅读数:7142019 年 9 月 15 日 17:11 本文经授权转载自公众号 PostgreSQL 中文社区,主要介绍了 Greenplum 集群概述.分布式数据存储和分布式查询优化. 一.数据库内核揭秘 Greenplum 是最成熟的开源分布式分析型数据库(今年 6 月份预计发布的 G

[转帖]Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(下篇)

Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(下篇) http://www.postgres.cn/v2/news/viewone/1/454 原作者:姚延栋 创作时间:2019-05-08 17:25:25+08   采编:wangliyun 发布时间:2019-05-09 08:25:28 欢迎大家踊跃投稿,投稿信箱:[email protected] 评论:0    浏览:1620 作者介绍 姚延栋,山东大学本科,中科院软件所研究生.PostgreSQL中文社区委员

《Linux内核分析》第六周学习笔记

<Linux内核分析>第六周学习笔记 进程的描述和创建 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [学习视频时间:1小时 撰写博客时间:2小时] [学习内容:进程创建的过程.使用gdb跟踪分析内核处理函数sys_clone] 一.进程的描述 1.1 进程描述符task_struct数据结构(一) 1. 进程控制块PCB——task_struct 为了管理进程,内核

《linux 内核完全剖析》 exit.c 代码分析笔记

exit.c 代码分析笔记 release 释放进程的函数release() 主要根据指定进程的任务数据结构指针,在任务数组中删除指定的进程指针,释放相关内存页,并立刻让内核重新调度进程的运行. void release(struct task_struct * p) //释放p指向的进程 { int i; if (!p) //常规检测p是否为0 return; if (p == current) { //不能把自己给释放了 printk("task releasing itself\n\r&q

《linux 内核完全剖析》 fork.c 代码分析笔记

fork.c 代码分析笔记 verifiy_area long last_pid=0; //全局变量,用来记录目前最大的pid数值 void verify_area(void * addr,int size) // addr 是虚拟地址 ,size是需要写入的字节大小 { unsigned long start; start = (unsigned long) addr; //把地址强制类型转换之后,赋值给start size += start & 0xfff; //取addr在当前虚拟地址中4