![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
open gauss
文章平均质量分 94
GoooHaaa
这个作者很懒,什么都没留下…
展开
-
MOT(6)--小结
我学习了opengauss的MOT部分源码,我的目标是弄清楚MOT大致原理,MASSTREE索引结构,深刻理解SILO设计算法,并且与之对比MVCC。MOT是一个基于内存的事务引擎,它使用了一种称为SILO的并发控制协议,以及一种称为MASSTREE的多版本B+树索引结构。SILO是一种优化的时间戳排序协议,它可以在不使用锁或原子操作的情况下实现高效的事务处理。MASSTREE是一种支持范围查询和动态分裂合并的多版本B+树索引结构,它可以在多核环境下提供高性能和可扩展性。原创 2023-10-17 00:07:22 · 107 阅读 · 0 评论 -
MOT(5)--SILO
Silo的一个重要特征是将事务标识符(Transaction ID,TID)以分散的方式分配给不同的处理器核心,以减少并发访问共享资源时的竞争和瓶颈。乐观并发控制是一种处理并发访问数据的策略,它假设事务之间的冲突发生的概率较低,因此不立即阻止事务的执行,而是允许它们同时进行,并在提交时检查是否存在冲突。这样,每个核心通常只需要访问其负责的分区,减少了共享资源的争用。类的构成如上图所示,在学习这个类的时候,我对比了以前的几个类的删除禁止操作,发现他们都是在public板块实现的,如下代码块所示。原创 2023-10-17 00:06:20 · 122 阅读 · 0 评论 -
MOT(4)--Masstree
MTIterator **,是一个用于多线程迭代器的类,它同样对几个变量类型进行了别名定义,值得注意的是,使用的private定义,让这种定义只能由该类使用,一方面限定了使用方式,另一方面防止了不同作用域的使用混乱问题。他的成员函数首先声明了获得索引大小和MASSTREE大小的两个函数然后实现了内存池的基本操作:初始化,摧毁,状态输出,获取子结点内存池状态,获取插入结点内存池状态再然后是关于locate(加载位置)的一系列函数,主要为静态函数。原创 2023-10-17 00:05:48 · 145 阅读 · 0 评论 -
MOT(3)--Masstree
如果使用内存池,那么它会尝试在内存池中分配一块内存空间,大小为MAX_MEMTAG_MASSTREE_LIMBO_GROUP_ALLOCATION_SIZE,并将返回的指针存储在变量limbo_space中。这个文件下实现了Masstree索引移除的辅助函数,包含对基础表的移除函数,gc_layer_rcu_callback_ng类以及其成员函数的实现,对()运算符号进行了两个不同参数重载函数的实现,并且实现了make函数。)设置为新插入键的值。最后,无论是否使用内存池,函数都会返回创建的新对象的指针。原创 2023-10-17 00:05:03 · 127 阅读 · 0 评论 -
MOT(2)-MASSTREE
文件路径:src\gausskernel\storage\mot\core\storage\index MASSTREE的大部分实现均在上述文件路径下的MASSTREE文件夹,或同级的masstree_index.cpp、masstree_index.h两个文件中,依据open gauss的文件组织,我们可以将mass tree划分为如下图所示的结构,在这其中,线程、迭代器、索引实现是最为复杂的三个文件夹,之后将会对其源码进行分析。原创 2023-10-17 00:04:22 · 228 阅读 · 0 评论 -
MOT(1)--概述
源码文件功能并发控制管理infra辅助与配置函数memory内存数据管理storage持久化存储system全局控制APIutils日志等通用方法内存引擎框架如下图所示该图片引用自CSDN对比我们以前分析过的行存储引擎,不难发现,JIT执行器是MOT特有的部分,而又由最初分析MOT与磁盘引擎所用的索引管理不同,所以接下来将会围绕这两点对MOT引擎的源码进行分析。原创 2023-10-17 00:02:58 · 431 阅读 · 0 评论 -
MVCC(6)--XID标记
如果没有进行二次检查,那么在返回CSN时,可能会返回一个基于无效。原创 2023-10-17 00:01:24 · 51 阅读 · 0 评论 -
MVCC(5)--VACCUM
Vacuum操作在整个数据库级别清理废旧元组,同时也会清理索引。他可以由数据库用户主动调用,也可以在工作线程满足阈值时或者定期进行调用。Vacuum自身除了清理空间以外,也承担了更新统计信息的功能(此处不做展开),让优化器(该部分由队友犇进行分析介绍)能更准确的进行代价优化。原创 2023-10-16 23:57:51 · 76 阅读 · 1 评论 -
MVCC(4)--事务可见性
例如,检查元组是否在扫描开始后被插入或删除,检查元组的xmax是否是一个多事务ID,检查元组的xmax是否是当前事务的ID等等。这些步骤大体上是对元组进行一系列复杂的并发控制和事务隔离检查,并根据检查结果进行相应的处理。如果元组的xmin在给定的快照中不可见,那么进入下面的代码块,在这个代码块中,会进行一些更复杂的检查和处理。判断是否当前的快照不是一个多版本并发控制(MVCC)的快照,并且元组的xmin是当前事务的ID。(也就是该元组被插入或更新的事务ID)在给定的快照中是否可见,并将结果存储在。原创 2023-10-16 23:57:07 · 170 阅读 · 1 评论 -
stOOrz---MVCC(3)--事务可见性
函数的主要逻辑是一个switch语句,它根据快照的satisfies属性的值来调用不同的函数。,从而判断其可见性,内存里的访问远远快于磁盘读写,因此opengauss的很多机制都是运行时候在内存,然后定期持久化到磁盘。我们对事务隔离级别做一个简单说明:SQL标准定义了脏写,脏读,不可重复读,幻读 在open gaus数据库的实现过程中,对隔离级别做了一些扩展。,它也属于共享内存的这部分,平时更新clog是内存中进行的,然后满足条件后会调用pg_fsync刷数据到磁盘上的clog文件,或者等待。原创 2023-10-16 23:56:22 · 83 阅读 · 1 评论 -
MVCC(2)--快照的实现
根据fother的定义,可知,若tstart <= ,则该事务Tother在T的快照中为未提交状态,其对数据库的写操作对事务T不可见;在一个事务的实际执行过程中,并不会在一开始就加载全部的CSN 日志,而是在扫描到某条记录以后,才会去 CSN 日志中查询该条记录头部 xmin和xmax这两个事务号对应的 CSN 值,并基于此进行可见性判断。本次对MVCC技术实现的快照部分做了较为详细的分析,更加细致的分析将会在后面展开,下一篇博客将要进行的是对MVCC可见性判断的分析。:快照通常在事务开始时创建。原创 2023-10-16 23:55:41 · 158 阅读 · 1 评论 -
MVCC(1)--概述
在了解MVCC技术之前,我们先来了解一个和他密切相关的概念——快照, 快照是数据库的一个只读副本,它记录了某一时刻数据库的状态。你可以把它想象成一个数据库的“照片”。快照可以用于备份,也可以用于在出现问题时恢复数据。提供了一个静态的视图来为报表提供服务。可以利用数据库快照来恢复数据库,相比备份恢复来说,这个速度会大大提高。和数据库镜像结合使用,提供读写分离作为测试环境或数据变更前的备份。当一个新的事务开始时,服务器会为这个事务创建一个新的快照。这个快照包含了一个事务在开始时数据库的一致性状态。原创 2023-10-16 23:54:32 · 53 阅读 · 1 评论 -
rewriteheap.cpp(8)--存储引擎
heap-only tuple技术简介。原创 2023-10-16 23:53:09 · 52 阅读 · 1 评论 -
heapam.cpp--存储引擎(6)
当执行日志备份时,SQL Server会扫描BCM页面,并将标记为已更改的范围包含在日志备份中,以及事务日志。相反,如果我们不使用in-place更新,那么每次薪水增加时,新的薪水值将在磁盘上的其他位置写入,然后我们需要更新索引和块列表以反映新值的位置。本次继续对heapam.cpp中的函数做了学习和解读,并且对heapam.cpp的函数框架做了初步总结,在下一篇博客当中,我将全面学习heapam.cpp的内容,并且对文件的函数做一个总结。在使用WAL的系统中,所有的修改在。原创 2023-10-16 23:51:17 · 55 阅读 · 1 评论 -
heapam.cpp--存储引擎(5)
然而,在并行扫描中,查询被分解成多个小任务,每个任务扫描表的一部分,这些任务可以在多个CPU核心上同时执行。每个分区包含一个或多个特定的值。例如,你可以创建一个复合分区表,其中主要的分区类型是范围,每个范围分区下又包含多个哈希或列表子分区。性能提升:如果查询在分区列的值上使用了合格的过滤器,BigQuery可以扫描与过滤器匹配的分区,并跳过其余的分区。这些部分可以是数据库的表,文件的块,或者其他形式的数据集合。间隔分区表:间隔分区表是范围分区表的一种扩展,它可以自动创建新的分区来存储超出现有范围的数据。原创 2023-10-16 23:50:33 · 42 阅读 · 1 评论 -
cbtree.cpp解读--存储引擎(3)
例如一个度为d的B-Tree,设其索引N个key,则其树高h的上限为logd((N+1)/2)logd((N+1)/2),检索一个key,其查找节点个数的渐进复杂度为O(logdN)O(logdN)。函数参数和返回值: 在opengauss中,当你定义一个函数时,你可以指定函数的参数和返回值的数据类型。数据类型转换: 在函数内部,通常需要进行数据类型转换,将输入参数从Datum转换为实际的数据类型,或将计算结果从实际数据类型转换为Datum。函数的作用是获取B-tree索引的选项,并根据需要进行验证。原创 2023-10-16 23:49:42 · 66 阅读 · 1 评论 -
cbtree.cpp解读--存储引擎(3)
例如一个度为d的B-Tree,设其索引N个key,则其树高h的上限为logd((N+1)/2)logd((N+1)/2),检索一个key,其查找节点个数的渐进复杂度为O(logdN)O(logdN)。函数参数和返回值: 在opengauss中,当你定义一个函数时,你可以指定函数的参数和返回值的数据类型。数据类型转换: 在函数内部,通常需要进行数据类型转换,将输入参数从Datum转换为实际的数据类型,或将计算结果从实际数据类型转换为Datum。函数的作用是获取B-tree索引的选项,并根据需要进行验证。原创 2023-10-16 23:49:02 · 60 阅读 · 1 评论 -
存储引擎文件解读(1)
openGauss的存储引擎是指数据库系统中负责数据的存储、组织、管理和访问的部分。从整个数据库服务的组成构架来看,存储引擎向上对接SQL引擎,向下对接存储介质,按照特定的数据组织方式,以页面、列存储单元(CU,compression unit)或其他形式为单位,通过存储介质提供的特定接口,对存储介质中的数据完成读、写操作。如下图所示shortage主流程代码如下:磁盘初始化,开关,同步等系统操作。原创 2023-10-16 23:45:51 · 78 阅读 · 1 评论 -
stOOrz队——open gauss存储引擎概述
openGauss的存储引擎是指数据库系统中负责数据的存储、组织、管理和访问的部分。从整个数据库服务的组成构架来看,存储引擎向上对接SQL引擎,向下对接存储介质,按照特定的数据组织方式,以页面、列存储单元(CU,compression unit)或其他形式为单位,通过存储介质提供的特定接口,对存储介质中的数据完成读、写操作。如下图所示shortage主流程代码如下:磁盘初始化,开关,同步等系统操作。原创 2023-10-16 23:44:55 · 485 阅读 · 1 评论