postgresql
文章平均质量分 85
韩楚风
多年服务端开发经验,目前在做数据库内核研发,希望和大家多交流数据库和产品研发方面的经验^.^
展开
-
postgresql 内核源码分析 事务提交回滚状态记录 clog机制流程,commit log文件格式,事务状态为什么单独记录的原因,分组优化及leader更新机制
PostgreSQL是一种开源的关系型数据库管理系统,其内核源码的分析对于深入理解其工作原理、性能优化以及定制开发等方面都具有重要意义。PostgreSQL的历史可以追溯到1986年,当时Michael Stonebraker和Eugene Wu在加州大学伯克利分校开始了POSTGRES项目的开发。该项目旨在开发一种具有可扩展性和可靠性的关系型数据库管理系统,以满足日益增长的数据库应用需求。在1994年,POSTGRES被发布为开源软件,并更名为PostgreSQL。原创 2023-09-23 20:48:43 · 6109 阅读 · 135 评论 -
postgresql 内核源码分析 btree索引插入分析,索引页面分裂流程,多举措进行并发优化,对异常进行保护处理
B树索引在PostgreSQL中得到了广泛应用,它是一种自平衡树数据结构,可以维护有序数据并允许进行搜索、顺序访问、插入和删除操作。在PostgreSQL中,可以在任何数据类型上使用B树索引,支持排序,支持大于、小于、等于、大于或等于、小于或等于的搜索。B树具有一些重要的特征。首先,B树是平衡的,每个叶子页与根都由相同数量的内部页分隔开,因此搜索任何值都需要花费相同的时间。其次,B树是多分支的,每个页面通常包含许多(数百个)ctid,因此B树的深度很小,对于非常大的表,实际上可以达到4-5的深度。原创 2023-09-16 20:39:12 · 7776 阅读 · 159 评论 -
postgresql 内核源码分析 btree索引的增删查代码基本原理流程分析,索引膨胀的原因在这里
在postgresql最常用的索引就是btree,它支持范围和等值查询。本文主要介绍btree的代码的入口,接口定义,主要涉及索引的查询,插入,删除,和数据的清理操作。索引是为了更快的找到实际数据表中的数据,那么索引键值就非常小,可以一次性从磁盘读取大量的索引数据。但是有些索引值中存储了实际数据,与数据是一一对应的,就是密集型索引,而有一些索引并不存储实际数据,而是存储范围内的最大最小值,此类型索引叫做稀疏索引;原创 2023-08-28 08:52:13 · 7498 阅读 · 137 评论 -
postgresql 内核源码分析 表锁relation lock的使用,session lock会话锁的应用场景,操作表不再困难
当表打开,或者操作表时,都需要对表relation 进行加锁,表锁定义了8种级互斥级别,另外还有会话级表锁 session lock。原创 2023-07-19 08:34:42 · 7504 阅读 · 69 评论 -
postgresql regular lock常规锁申请与释放 以及fastpath快速申请优化的取舍
每种常规锁都需要定义几个要素,它由结构体 LockMethodData 定义;锁的模式类型,也就是锁分了几种加锁方式,比如这里表锁是8种,也就是8级表锁;锁的冲突矩阵,它是一个按bit的二维表,也就是各级锁方式之间的冲突关系,比如读写互斥,读读不冲突等;锁的名字,主要是为了查找调试;postgresql 已经定义了一种默认锁 default_lockmethod, 也可以自定义用户锁。原创 2023-07-16 09:43:35 · 5786 阅读 · 58 评论 -
postgresql regular lock常规锁 烤的内嫩外焦,入口即化
postgresql regular lock 常规锁,主要用于数据库对象的加锁,如表,根据用户请求来加锁。它有死锁检测,在事务结束时会自动释放。原创 2023-07-08 10:24:51 · 6095 阅读 · 47 评论 -
postgresql内核分析 spinlock与lwlock原理与实现机制
在postgresql 中,有大量的并发同步,所以避免不了使用很多保护锁。spinlock 自旋锁lightweight lock(LWLocks) 轻量级锁regular lock(a/k/a heavyweight locks) 普通锁SIReadLock predicate locks 谓词锁本文主要针对这四种锁进行分享,起抛砖引玉的作用。轻量级锁将加锁过程分成了两个阶段,第一阶段通过原子操作来检测,如果可以加锁,就加锁成功;原创 2023-07-03 08:00:00 · 6306 阅读 · 54 评论 -
终于可以执行SQL了【手把手教你写数据库】
经过第一阶段的准备,可以解析出create/drop table, select/insert等SQL语句了,那么如何把这几条语句按数据库流程执行完成呢。又经过了第二阶段,这四条语句可以执行了,这是一个不小的阶段;这就涉及到SQL的执行器,执行器是一个比较复杂的模块,从架构上看,它桥接了SQL解析和存储层,同时涉及到了数据字典更新维护,数据扫描,数据从存储到内存的转换等很多模块。下面我们就来详细看一看,taodb是个什么样的数据库,它从零成长到现在,具有什么样的能力了呢?原创 2023-06-19 08:00:00 · 19882 阅读 · 10 评论 -
手写数据库toadb 保姆级教程来了
手写数据库开始了,从零开始,step by step ,让小白都可以轻松开发数据库内核,简历上再增亮点,面试多了一份自信。toad database system,“癞蛤蟆”数据库,正如其名,我们想吃天鹅肉,它是一款从零完全开始手写的数据库,同时在每做一步都会有教程和分析,期待更多人加入,一起同行。故不积跬步,无以至千里;不积小流,无以成江海。学以致用,从现在就开始吧。原创 2023-06-03 11:10:19 · 20048 阅读 · 1 评论 -
postgresql 内核源码分析 语法解析 gram.y
本文是基于postgresql 15的代码gram.y进行分析解读,演示是在centos8系统上进行。概述通过flex/bison进行词法和语法解析,生成语法分树。当然这里使用的是pure-parse模式,也就是flex的输入是指定的str,而且需要初始化每个scanner的额外数据及扫描状态结构;在bison中也是,需要初始化对应的词法scanner状态结构和额外数据的结构。这样就可以将客户端输入的SQL字符串输入到词法分析器,这个词法分析器的输出对应到语法分析器,语法分析器将解析后的内容存到语法树中。原创 2023-05-28 21:45:00 · 5919 阅读 · 3 评论 -
postgresql内核源码分析-删除表drop table流程
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。介绍了内核源码中关于DDL中drop table的处理流程。在删除表时,如何做到删除表物理文件与的事务原子性。原创 2023-05-21 23:30:00 · 5605 阅读 · 3 评论 -
postgresql walsender源码分析
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。walsender 看名字就知道,它是通过tcp协议发送write ahead log。那么它是什么场景下使用呢?以及如何获得wal产生的呢?如何与对应协调呢?下面我们就来看看。原创 2023-05-14 22:45:00 · 5371 阅读 · 2 评论 -
postgresql 词法/语法(scanner/parser)中flex/bison介绍
在数据库内核中,语法解析和词法分析已经非常成熟,本文来介绍一下它使用的基本知识点,后面介绍数据库内容时,也能更好的理解。本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。其中有两个重要的工具来协助完成词法和语法分析,它们是:flex词法分析(lexical analysis 或称为scanning)bison是语法分析(systax analysis 或称为parsing)原创 2023-05-14 22:45:00 · 5746 阅读 · 1 评论 -
postgresql insert 执行流程分析
本文是基于postgresql 15上 insert ddl执行流程分析,对应insert SQL语句在执行时对触发器,buffer,以及索引的处理流程进行了分解介绍。原创 2023-05-07 22:30:00 · 5716 阅读 · 0 评论 -
postgresql standby启动流程分析
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。hot-standby模式是postgresql提供的一种高可用方案,可以通过一主一备,或一主多备,以及一主多级级联备来达到数据和业务的高可用,备节点也可以进行只读业务,所以对只读业务的性能也会有很好的提升。通过hot-standby模式也可以搭建容灾部署,达到多地多中心的效果。原创 2023-05-07 22:45:00 · 5668 阅读 · 1 评论 -
postgresql 源码结构分析
本文对postgresql源码目录结构进行介绍,以及核心代码目录介绍,对pg内核感兴趣的朋友请关注本专栏内容。原创 2023-04-23 22:15:00 · 5724 阅读 · 0 评论 -
postgresql15 内核源码分析-buffer查找接口
在postgresql 15中,SQL引擎使用表文件中的数据时,先读入共享缓冲区,修改时也先在缓冲区进行修改,而后通过缓冲区替换算法,定时脏页落盘等机制将数据写入磁盘。共享缓冲区是由buffer数组构成,每一个buffer对应数据文件中的一个page,默认配置时就是8K。前面介绍过缓冲区替换算法及查找流程,本文对查找接口进行分享介绍。在postgresql 主要有六种查找buffer的接口,分别在不同场景下,以提升性能。原创 2023-04-07 08:33:11 · 4925 阅读 · 0 评论 -
postgresql Buffer并发控制一
在postgresql 为了加速数据的读写性能,在共享内存中增加了数据缓冲区,也就是我们常说的buffer。buffer是在多进程之间共享,所以需要增加冲突处理,也就是并发控制,本文主要介绍并发控制的方法,以及该种方法的用途。原创 2023-04-04 13:23:06 · 2102 阅读 · 1 评论 -
postgresql 中buffer操作
在postgresql中,SQL引擎使用表文件中的数据时,先读入共享缓冲区,修改时也先在缓冲区进行修改,而后通过缓冲区替换算法,定时脏页落盘等机制将数据写入磁盘。共享缓冲区是由buffer数组构成,每一个buffer对应数据文件中的一个page,默认配置时就是8K。前面介绍过缓冲区替换算法及查找流程,本文对查找接口进行分享介绍。在postgresql 主要有六种查找buffer的接口,分别在不同场景下,以提升性能。原创 2023-04-01 08:32:19 · 2151 阅读 · 0 评论 -
Postgresql内核源码分析-如何向client发送tuple格式
当我们在客户端查询时,除了表中的数据之外,还有一个状态信息,看到的也是以tuple的形式展示出来,其实这此数据是临时组成tuple格式,而不是存储在表中的数据。下面我们就来看下,这类型数据是如何拼装成tuple格式的,需要那些步骤。原创 2023-03-26 20:01:27 · 1794 阅读 · 0 评论 -
Postgresql内核源码分析-tuple是如何拼装的
在SQL中我们可以查看表的每个字段的数据,在数据库中字段的数据如何组成一个行数据,也叫tuple,又如何从磁盘文件中获取某张表的字段数据。本文就来看看行数据的拼装/拆解接口,以及对应的流程。原创 2023-03-26 19:54:19 · 1907 阅读 · 0 评论 -
Postgresql内核源码分析-redo代码流程
本文是基于postgresql 15的代码进行分析解读,当我们的数据库意外down机后,在内存缓存中的数据就会丢失,那如何恢复它们呢,这个步骤就是redo的过程。简单来说,在数据库启动时会检查上次停止的状态,如果不是正常停止就会启动redo流程,redo也就是找到上一个checkpoint,然后对之后的wal进行回放。原创 2023-03-13 08:16:48 · 759 阅读 · 0 评论 -
Postgresql内核源码分析-redo是如何恢复丢失数据的
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。当我们的数据库意外down机后,在内存缓存中的数据就会丢失,那如何恢复它们呢,这个步骤就是redo的过程。简单来说,在数据库启动时会检查上次停止的状态,如果不是正常停止就会启动redo流程,redo也就是找到上一个checkpoint,然后对之后的wal进行回放。原创 2023-03-07 08:23:38 · 737 阅读 · 0 评论 -
Postgresql内核源码分析-查询执行策略初探
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。查询执行阶段,主要有portal这个结构来记录信息,并贯穿整个过程。查询主要分有计划树和无计划树两种类型,根据查询类型分别由和ProcessUtility进行执行;Executor 模块主要执行DML操作,执行逻辑统一为select,或select基础上加一些额外处理。代码主要在src/backend/executor下。原创 2023-03-03 08:14:14 · 1056 阅读 · 1 评论 -
Postgresql内核源码分析-表数据膨胀是怎么回事
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。在我们使用postgresql数据库时,总会产生一些数据膨胀,导致查询变慢,索引失效,为什么会有数据膨胀呢?产生后我们怎么做才能让数据库恢复正常呢?原创 2023-02-24 08:35:45 · 931 阅读 · 0 评论 -
Postgresql内核源码分析-unlogged表
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。指定为unlogged表,该表不会记录wal日志,也就是数据会存在丢失风险,不会被恢复。什么时候会用呢?unlogged表不记录wal的原因,insert/update操作就比普通表快很多,所以在性能测试时不防尝试一下。那么unlogged表是如何实现的呢?创建表的流程和普通表一致,只是在创建表文件时,会多创建一个fork文件,也就是INIT_FORK,文件命名为 relfilenode_init;原创 2023-02-24 08:03:34 · 747 阅读 · 0 评论 -
Postgresql内核源码分析-索引如何加速查询
本文介绍postgresql 15中索引如何加速查询,以及索引中记录的内容和索引与数据如何关联起来。其中indextuple如何组装,它需要的tid又是在什么时机形成。原创 2023-02-17 08:09:57 · 718 阅读 · 0 评论 -
Postgresql内核源码分析-vacuum流程2
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。vacuum有两种调用途径,通过SQL命令和可执行命令,通过autovacuum后台服务。命令方式可以通过设置参数,对vacuum行为可选项进行控制;autovacuum是后面服务,根据配置定期进行调用执行,按数据库列表进行遍历,然后分别遍历各个数据库内的所有表及表涉及的对象。原创 2023-02-10 13:10:55 · 702 阅读 · 0 评论 -
Postgresql内核源码分析-vacuum流程
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。postgresql的MVCC机制,在update时会产生新旧版本,而且存储在表文件中,导致表数据膨胀,影响查询扫描的效率。vacuum的引入就是定期对deadtuple的清理,所谓deadtuple,对所有事务来说都是过期版本。下面详细介绍vacuum具体做那些事情,以及如何来展,在清理过程中又是怎么避免与业务的冲突。原创 2023-02-05 15:37:32 · 688 阅读 · 0 评论 -
Postgresql内核源码分析-vacuum命令
本文是基于postgresql 14的代码进行分析解读,演示是在centos8系统上进行。命令介绍Vacuum 命令主要是进行垃圾回收和analyze;命令参数说明VACUUM [ (option[, ...] ][, ...] ]whereoptionFULL [booleanFREEZE [booleanVERBOSE [booleanANALYZE [booleanbooleanbooleanbooleanTRUNCATE [boolean。原创 2023-02-01 08:47:01 · 1264 阅读 · 0 评论 -
Postgresql内核源码分析-heapam分析
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。简要说明Heap acess manage,在postgres中默认表的存储类型为heap table,那么针对heap table有一组操作访问接口。当然postgres做了一层抽象,对table的操作抽象成了一组接口定义,类似于虚函数,对应heap table类型有一组实现。原创 2023-01-27 18:26:58 · 1005 阅读 · 2 评论 -
postgresql内核源码分析-表访问方法一
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。表操作接口 tableam 在postgresql中定义了统一的表访问操作的统一接口,同时也定义了一组堆表操作的接口。这样就可以非常灵活的定义其它类型存储结构的表操作。堆表接口定义如下,主要分为扫描(索引,普通,并行),索引操作,数据行操作,表操作几大类型;};表扫描结构介绍heap 表扫描,会用下面结构记录扫描过程的信息,结构成员分为:1、initscan初始化的部分;2、scan过程中的信息记录;原创 2022-12-20 14:30:54 · 794 阅读 · 0 评论 -
postgresql内核源码分析-InvalidMessage共享内存管理
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。无效消息,是各运行中的backend之间发送的消息,为了在各backend之间通信,在共享内存中分配了sSharedInval部分,用于传递消息。当sharedinvalid共享内存空间不足时,需要通知各backend进行重置,以免有些backend落后很多。invalidmessage共享内存管理分配创建内存由shmInvalBuffer来记录内存位置,整个由 SISeg结构来维护管理。原创 2022-12-18 17:29:33 · 877 阅读 · 0 评论 -
postgresql内核源码分析-共享缓冲区管理二
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。缓冲区查找当执行SQL时,需要表文件中的数据时,先从共享缓冲区中查找,如果有就使用;如果没有就会引发替换或加载缓冲区的IO行为。ReadBuffer主要对表文件的查找,其中调用ReadBufferExtended;查找策略采用默认策略 clock sweep;数据块已经在缓冲区中加载;直接通过查找得到buffer。原创 2022-12-10 21:56:40 · 858 阅读 · 0 评论 -
postgresql内核源码分析-共享缓冲区管理一
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。概要简介共享缓冲区(share buffer),也就是我们说的BufferPool, 用来对表数据进行缓存。我们执行SQL需要使用表数据,并不是直接从磁盘上读文件来的,而是从缓冲区中得来的,当缓冲区没有时,先从文件加载到缓冲区,再从缓冲区中拿来使用,大概是这样一个过程。这里说的缓冲区是共享的,也就是多个backend共同可以使用, 那么就会涉及到多任务的并发竞争和数据同步了,会用到锁。原创 2022-12-10 12:27:51 · 899 阅读 · 0 评论 -
postgresql内核源码分析-事务快照snapshot
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。快照机制快照是事务机制的一项重要组成部分,与MVCC,以及锁共同完成事务的隔离性,一致性和原子性。快照主要获取当前整个数据库的所有事务的状态,通过三个事务号区间( (xid,xmin);[xmax, xid))来确定当前事务对多版本数据的可见性,。其中两边的区间是明确的,第一个区间一定是完成的,是可见的;第三个区间一定是未来的,对当前事务来说是未发生的,不可见;原创 2022-11-29 17:06:27 · 1104 阅读 · 0 评论 -
postgresql内核源码分析-事务号分发
本文是基于postgresql 15的代码进行分析解读,64位transactionID的定义和分配分发。事务号的定义32位事务号定义之前版本事务号是32位,现在版本已经扩展到了64位,但与之前是保持了兼容;在64位的高32位是epoch,低32位与之前一致,是递增加1的事务号,并且能做到回卷。32位事务号的定义:typedef;typedef;#define)0)#define)1)64位事务号的定义采用了结构体的形式,取值通过一组接口或宏的调用来获得。/**/{原创 2022-11-27 23:06:26 · 886 阅读 · 0 评论 -
postgresql内核源码分析-事务状态机
本文是基于postgresql 14的代码进行分析解读,数据库事务状态机分析。事务状态分层事务块的状态,也就是大的事务,可以跨多个SQL命令,类似于begin/end之间;包括子事务的状态 ,以及事务的层次;子事务由savepoint产生。命令事务状态,也就是单个SQL命令的执行状态,每输入一条SQL命令,都会有状态的维护;当执行单条SQL时,自动提交打开,这两个状态是一致的;底层事务处理,处理事务对应状态下的事情。比如在事务提交时,需要调用日志管理进行日志处理,还有清理工作等;原创 2022-11-24 19:16:13 · 864 阅读 · 0 评论 -
postgresql内核源码分析-认证流程
postgresql 内核原码 认证原创 2022-10-26 22:40:56 · 872 阅读 · 0 评论 -
postgresql内核源码分析-lwlock初始化
postgresql,内核源码,内核分析,lwlock原创 2022-10-05 10:09:17 · 879 阅读 · 0 评论