文章分类 - openGauss源码解析
openGauss数据库是华为公司在深度融合技术应用于数据库领域多年经验的基础上,结合企业级场景要求,推出的新一代企业级开源数据库。本文将从各方面对该openGauss数据库源码进行详细介绍。
摘要:openGauss源码解析:SQL引擎源解析(9) 2. 数据分布抽取方法 数据分布的存储给出了数据分布在openGauss的逻辑结构和存储方式。那么上面介绍的数据分布信息是如何从数据中获得呢?针对该问题,下面将简要介绍openGauss抽取分布的主要过程。为加深对方法的理解,先分析该问题面临的挑战
阅读全文
摘要:openGauss源码解析:SQL引擎源解析(10)4. 代价估算查询执行的代价分为I/O代价和CPU代价。这两种代价都与查询过程中所处理的元组数量正相关。因此,通过选择率对查询计划的总代价进行评估是较为准确的。但由于硬件环境的差别,openGauss的代价模型输出的“代价”只是一种度量计划好坏的通
阅读全文
摘要:openGauss源码解析:SQL引擎源解析(11)6.3.3 物理路径在数据库中,路径使用path结构体来表示,path结构体“派生”自Node结构体,path结构体同时也是一个“基”结构体,类似于C++中的基类,每个具体路径都从path结构体中“派生”,例如索引扫描路径使用的IndexPath结
阅读全文
摘要:openGauss源码解析:SQL引擎源解析(4)6.2.2 语法分析openGuass中定义了bison工具能够识别的语法文件gram.y,同样在Makefile中可以通过bison工具对gram.y进行编译,生成gram.cpp文件。在openGauss中,根据SQL语言的不同定义了一系列表达S
阅读全文
摘要:openGauss源码解析:SQL引擎源解析(5)6.2.3 语义分析语义分析模块在词法分析和语法分析之后执行,用于检查SQL命令是否符合语义规定,能否正确执行。负责语义分析的是parse_analyze函数,位于analyze.cpp下。parse_analyze会根据词法分析和语法分析得到的语法
阅读全文
摘要:openGauss源码解析:SQL引擎源解析(6)6.2.4 解析流程分析在了解了SQL解析的大致流程后,通过一个具体的案例了解一下SQL解析过程中的具体代码流程。首先创建基表warehouse,语句如下。CREATE TABLE warehouse( w_id SMALLINT PRIMARY K
阅读全文
摘要:openGauss源码解析:SQL引擎源解析(2) 6.2 SQL解析 1970年,埃德加·科德(Edgar Frank Codd)发表了关系模型的论文,奠定了关系数据库的理论基础,随后在1974年,Boyce和Chamber在关系模型的基础上推出了Sequel语言,后来演进成了SQL(struct
阅读全文
摘要:openGauss源码解析:SQL引擎源解析(1)第6章 SQL引擎源解析SQL引擎作为数据库系统的入口,主要承担了对SQL语言进行解析、优化、生成执行计划的作用。对于用户输入的SQL语句,SQL引擎会对语句进行语法/语义上的分析以判断是否满足语法规则等,之后会对语句进行优化以便生成最优的执行计划给
阅读全文
摘要:openGauss源码解析:事务机制源码解析(16)5. 支持NUMA-aware数据和线程访问分布NUMA远端访问:内存访问涉及访问线程和被访问内存两个的物理位置。只有两者在同一个NUMA Node中时,内存访问才是本地的,否则就会涉及跨Node远端访问,此时性能开销较大。Numactl开源软件提
阅读全文
摘要:openGauss源码解析:SQL引擎源解析(3)6.2.1 词法分析openGauss采用flex和bison两个工具来完成词法分析和语法分析的主要工作。对于用户输入的每个SQL语句,它首先交由flex工具进行词法分析。flex工具通过对已经定义好的词法文件进行编译,生成词法分析的代码。openG
阅读全文
摘要:openGauss源码解析:事务机制源码解析(15) 4. CLOG Partition优化 CLOG日志即是事务提交日志(详情可参考章节“5.2.2 事务ID分配及CLOG/CSNLOG)”,每个事务存在4种状态:IN_PROGRESS、COMMITED、ABORTED、SUB_COMMITED,
阅读全文
摘要:openGauss源码解析:事务机制源码解析(14)2. Cache align消除伪共享CPU在访问主存时一次会获取整个缓存行的数据,其中x86典型值是64字节,而ARM 1620芯片L1和L2缓存都是64字节,L3缓存是128字节。这种数据获取方式本身可以大大提升数据访问的效率,但是假如同一个缓
阅读全文
摘要:openGauss源码解析:事务机制源码解析(13)5.3.6 基于鲲鹏服务器的性能优化本章着重介绍openGauss基于硬件结构的锁相关的函数及结构体的性能优化。1. WAL Group inset优化数据库redo日志缓存系统指的是数据库redo日志持久化的写缓存,数据库redo日志落盘之前会写
阅读全文
摘要:openGauss源码解析:事务机制源码解析(12)5.3.5 无锁原子操作openGauss封装了32、64、128的原子操作,主要用于取代自旋锁,实现简单变量的原子更新操作。(1) gs_atomic_add_32:32位原子加,并且返回加之后的值。对应的代码如下:static inline i
阅读全文
摘要:openGauss源码解析:事务机制源码解析(8)5.3 锁机制数据库对公共资源的并发控制是通过锁来实现的,根据锁的用途不同,通常可以分为3种:自旋锁(spinlock)、轻量级锁(LWLock,light weight lock)和常规锁(或基于这3种锁的进一步封装)。使用锁的一般操作流程可以简述
阅读全文
摘要:openGauss源码解析:事务机制源码解析(9)5.3.3 常规锁常规锁是使用哈希表实现的。常规锁支持多种锁模式(lock modes),这些锁模式之间的语义和冲突是通过冲突表来定义的。常规锁主要用于业务访问的数据库对象加锁。常规锁的加锁遵守数据库的两阶段加锁协议,即访问过程中加锁,事务提交时释放
阅读全文
摘要:openGauss源码解析:事务机制源码解析(10)5.3.4 死锁检测机制死锁主要是由于进程B要访问进程A所在的资源,而进程A又由于种种原因不释放掉其锁占用的资源,从而数据库就会一直处于阻塞状态。如图5-17中,T1使用资源R1去请求R2,而T2事务持有R2的资源去申请R1。图5-17 死锁状态形
阅读全文
摘要:openGauss源码解析:事务机制源码解析(11)2. 常规锁死锁检测openGauss在获取锁时如果没有冲突可以直接上锁;如果有冲突则设置一个定时器timer,并进入等待,过一段时间会被timer唤起进行死锁检测。如果在某个锁的等锁队列中,进程T2排在进程T1后面,且进程T2需要获取的锁与T1需
阅读全文
摘要:openGauss源码解析:事务机制源码解析(3) 4. 事务状态转换相关函数简述 1) 事务处理子函数:根据当前事务上层状态机,对事务的资源进行相应的申请、回收及清理。 具体介绍如表5-2所示。 表5-2 事务处理子函数 子函数 说明 StartTransaction 开启事务,对内存及变量进行初
阅读全文
摘要:openGauss源码解析:事务机制源码解析(4)5.2.2 事务ID分配及CLOG/CSNLOG为了在数据库内部区别不同的事务,openGauss数据库会为它们分配唯一的标识符,即事务id(transaction id,缩写xid),xid是uint64单调递增的序列。当事务结束后,使用CLOG记
阅读全文