随笔分类 - postgresql
摘要:我们知道,在数据库中为了并发控制,少不了要使用各种各样的锁(lock)。PostgreSQL中也不例外。 在PostgreSQL中有三种级别的锁,他们的关系如下: 那么按照顺序,我们先来讨论下PostgreSQL的最底层的SpinLock。 作为PostgreSQL的最底层的锁,SpinLock比较
阅读全文
摘要:"上文" 我们讨论了PostgreSQL的MVCC相关的基础知识以及实现机制。关于PostgreSQL中的MVCC,我们只讲了元组可见性的问题,还剩下两个问题没讲。一个是"Lost Update"问题,另一个是PostgreSQL中的序列化快照隔离机制(SSI,Serializable Snapsh
阅读全文
摘要:PostgreSQL为开发者提供了一组丰富的工具来管理对数据的并发访问。在内部,数据一致性通过使用一种多版本模型(多版本并发控制,MVCC)来维护。这就意味着每个 SQL 语句看到的都只是一小段时间之前的数据快照(一个数据库版本),而不管底层数据的当前状态。这样可以保护语句不会看到可能由其他在相同数
阅读全文
摘要:在 PostgreSQL中,每一个进程都有属于自己的共享缓存(shared cache)。例如,同一个系统表在不同的进程中都有对应的Cache来缓存它的元组(对于RelCache来说缓存的是一个RelationData结构)。同一个系统表的元组可能同时被多个进程的Cache所缓存,当其中某个Cach
阅读全文
摘要:本文源于最近修正的一个关于psqlodbc的bug,该bug在近期的psqlodbc的git上也有人提交了修正。 关于该bug的修正代码可以看这里: "https://git.postgresql.org/gitweb/?p=psqlodbc.git;a=commit;h=85f6fade3" 说道
阅读全文
摘要:今天我们对postmaster的以下细节进行讨论: 2.与前端的交互 2.1backend的启动和client的连接请求的认证 关于backend的启动,其函数调用栈如下: typedef struct bkend { pid_t pid; / process id of backend / lon
阅读全文
摘要:之前我的一些文章都是在说Postgres的一些查询相关的代码。但是对于Postgres服务端是如何启动,后台进程是如何加载,服务端在哪里以及如何监听客户端的连接都没有一个清晰的逻辑。那么今天我来说说Postgres中的 postmaster 模块的代码,试着解答这些问题。 在正式讨论之前,我先说一下
阅读全文
摘要:5.ModifyTable节点 先看一个ModifyTable节点的例子: 你可能疑惑为啥上面的查询计划里面没有"ModifyTable"这样的字眼,下面是explain.c文件中的一段: 由此我们可以看到,对于ModifyTable节点,explain会判断是增删改中的哪一种从而作出判断。所以当在
阅读全文
摘要:控制节点 控制节点用于完成一些特殊的流程执行方式。由于PostgreSQL为査询语句生成二叉树状的査询计划,其中大部分节点的执行过程需要两个以内的输入和一个输出。但有一些特殊的功能为了优化的需要,会含有特殊的执行方式和输人需求(例如对于update、INSERT和DELETE,在普通的SELECT基
阅读全文
摘要:我们公司基于postgres开发了一款数据库产品,不用说我们对OSS的源码做了改动,并且也集成和自己编写了一些插件。因此,当postgresql和相关插件升级时,我们也需要将升级反应到自己的产品中去,这是背景。 这次的问题是在我们升级postgresql的插件orafce(3.2.0 3.6.0)时
阅读全文
摘要:3.HashJoin 节点 Hashjoin节点实现了Hash连接算法,它能够实现前面说到的六种连接方式。 以下我们以表R(左关系)与表S(右关系)连接为例,说明Hash连接的实现过程。 1)对一个表(例如S)进行Hash时,其块和桶数量的确定和划分方法如下: ①首先对S分块(batch),估算存储
阅读全文
摘要:Join节点 JOIN节点有以下三种: 连接类型节点对应于关系代数中的连接操作,PostgreSQL中定义了如下几种 连接类型 (以T1 JOIN T2 为例): 1)Inner Join:内连接,将T1的所有元组与T2中所有满足连接条件的元组进行连接操作。 2)Left Outer Join:左连
阅读全文
摘要:接前文,我们继续说剩下的4个Materialization节点。 7.SetOp节点 SetOp节点用于处理集合操作,对应于SQL语句中的EXCEPT、INTERSECT两种集合操作,至于另一种集合操作UNION,可直接由Append节点来实现。 一个SetOp节点只能处理一个集合操作(由两个集合参
阅读全文
摘要:物化节点 顾名思义,物化节点是一类可缓存元组的节点。在执行过程中,很多扩展的物理操作符需要首先获取所有的元组后才能进行操作(例如聚集函数操作、没有索引辅助的排序等),这时要用物化节点将元组缓存起来。下面列出了PostgreSQL中提供的物化节点。 1.Material节点 先上例子: 这里的子查询“
阅读全文
摘要:接前文 "跟我一起读postgresql源码(九)——Executor(查询执行模块之——Scan节点(上))" ,本篇把剩下的七个Scan节点结束掉。 8.SubqueryScan 节点 SubqueryScan节点的作用是以另一个査询计划树(子计划)为扫描对象进行元组的扫描,其扫描过程最终被转换
阅读全文
摘要:从前面介绍的可优化语句处理相关的背景知识、实现思想和执行流程,不难发现可优化语句执行的核心内容是对于各种计划节点的处理,由于使用了节点表示、递归调用、统一接口等设计,计划节点的功能相对独立、代码总体流程相似,下面介绍执行器中各种计划节点的相关执行过程。 在PostgreSQL中,计划节点分为四类,分
阅读全文
摘要:2.可优化语句的执行 可优化语句的共同特点是它们被查询编译器处理后都会生成査询计划树,这一类语句由执行器(Executor)处理。该模块对外提供了三个接口: ExecutorStart、ExecutorRun 和 ExecutorEnd,其输入是包含査询计划树的数据结构QueryDesc,输出则是相
阅读全文
摘要:1.数据定义语句的执行 数据定义语句(也就是之前我提到的 非可优化语句 )是一类用于定义数据模式、函数等的功能性语句。不同于元组增删査改的操作,其处理方式是为每一种类型的描述语句调用相应的处理函数。 数据定义语句的执行流程最终会进入到ProcessUtility处理器,然后执行语句对应的不同处理过程
阅读全文
摘要:pg_basebackup命令首先解析输入的参数,再调用BaseBackup()函数进行备份处理。 在BaseBackup()函数内部,会首先传送WAL日志(如果指定了 x选项的话)。随后依次遍历所有的tablespace复制备份整个数据库的文件。根据pg_basebackup命令的 F选项的指定情
阅读全文
摘要:顾名思义,物化节点是一类可缓存元组的节点。在执行过程中,很多扩展的物理操作符需要首先获取所有的元组后才能进行操作(例如聚集函数操作、没有索引辅助的排序等),这时要用物化节点将元组缓存起来。下面列出了PostgreSQL中提供的物化节点。 物化节点概述 物化节点需要有元组的缓存结构,以加快执行效率或实
阅读全文
浙公网安备 33010602011771号