自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 表达式计算解析(3)

ExecMakeFunctionResultNoSets和ExecMakeFunctionResult函数是表达式计算中的核心函数,两个函数不同的地方在于一个用于集合,一个用于单值,单值可以看做是集合的特殊情况。这几篇文章我简要解析了表达式计算的几个步骤,表达式计算和执行算子有着密不可分的联系,算子执行过程中需要表达式的值进行元组过滤,以减少内存开销。函数的返回值为bool类型的值,当返回true时代表表达式还未执行完,返回false时代表表达式全部执行完。

2023-10-16 23:55:39 65 1

原创 表达式计算解析(2)

本篇文章介绍了ExecInitExpr函数和ExecEvalAnd函数的用法,统述了表达式计算的相关函数,本篇文章以及下一篇文章我将对部分函数作简要解析。中我将继续介绍表达式计算的内容。此部分函数所在源文件是。

2023-10-16 23:54:42 37 1

原创 表达式计算解析(1)

初始化使用统一的函数ExecInitExpr,根据表达式的类型不同选择不用的处理方式。表达式计算和前几篇文章介绍的算子息息相关,很多个算子里面都需要计算表达式,过滤元组,再返回可行元组,因此,弄懂表达式计算至关重要。表达式计划树的好处就是能够把表达式计算分成一个个单元运算,和火山模型一样,上层运算调用下层运算,下层运算结果返回给上层运算,最后顶层结果返回给火山模型中的各个算子进行元组过滤。注意:本例只是一个特殊情况,使得表达式计划树恰好是一棵二叉树,实际上,表达式计划树只是一个更为普遍的树形结构。

2023-10-16 23:54:04 58 1

原创 控制算子----BitmapAnd和BitmapOr

这篇文章里我介绍了BitmapAnd和BitmapAnd算子,这两个算子十分重要,主要是对BitmapIndexScan算子中返回的数据页位图进行与操作和或操作,得到最终的位图。有关Bitmap(位图)的内容我在之前的文章:扫描算子—-nodeBitmapScan.cpp解析中介绍过了,可以点击此处跳转阅读。而今天要介绍的BitmapAnd算子和BitmapOr算子也很重要。BitmapAnd和BitmapOr顾名思义,就是对位图做与运算和或运算。执行过程较为简单,具体直接见代码清单1中的注释。

2023-10-16 23:53:30 160 1

原创 控制算子----nodeResult.cpp解析

Result算子用于处理只有一个结果(例如SELECT 3*2或者INSERT语句只包含values子句并不包含列名)或者where表达式中的结果是常量(如 SELECT * FROM t WHERE 2>1,过滤表达式”2>1”是常量)的流程。控制算子主要用于执行特殊流程,这类流程通常包含多个输入,例如Union操作,需要把多个子结果合并成一个。Result算子主要用来处理一些简单的控制过程,由于opengauss数据库没有投影算子和选择算子,Result算子一定程度上可以代替这两个算子。

2023-10-16 23:51:42 30 1

原创 扫描算子----BitmapScan解析(1)

为了解决数组占用空间过大这一问题,我们引入bitmap(位图),bitmap是一串bit流,bit流中的每一个1代表对应的数字在数组中。假设一个数据页包含了Table中6行数据,上图中第1、3次读取是在第一个数据页里,第2、4次读取是在第二个数据页里,读取时总是在不同的数据页中跳转,不能很好地利用空间局部缓存。我对TIDScan算子作了解读,这篇文章里我将对和索引有关的BitmapScan包含的两个算子BitmapIndexScan算子和BitmapHeapScan算子简要解读。

2023-10-16 23:51:09 196 1

原创 扫描算子----Nodetidscan.cpp解析

而Name和Age所对应的索引是非聚集(聚簇)索引,非聚集(聚簇)索引通常定位到主码,例如,通过Name(Age)只能查找到Id,再通过Id查找TID对应的行数据。当TID发生改变时,需要对索引表进行修改,如果所有索引都采用聚集(聚簇)索引,那么所有需要维护所有索引,所消耗的成本极大。将一部分聚集(聚簇)索引改成非聚集(聚簇)索引,则其他字段到主码字段的索引不需要修改,只需要修改主码到TID的索引,大大减少了维护索引表的开销。非聚集(聚簇)索引是指间接定位到TID上的索引,通常其直接定位到主码。

2023-10-16 23:50:38 42 1

原创 扫描算子----NodeIndexscan.cpp解析

数据库索引是为了提高查询速度而设立了一种数据结构。例如,日常生活中查字典时,可以通过拼音或者部首+笔画数快速地查找汉字,这里的拼音、部首、笔顺等都可以算作索引,如果没有了索引,就只能阅读整本字典,一一查找所需的汉字,这与建立索引相比,无疑是效率很低的做法。因此,建立索引能显著提高查询的速度和效率。同样,数据库中,默认扫描方式是全表扫描,而建立了索引之后,扫描时会直接定位到索引值对应的行数,大大减少遍历的次数。

2023-10-16 23:50:01 30 1

原创 扫描算子----NodeSeqscan.cpp解析

TupleTableSlot结构体是数据库执行过程中临时存储元组数据的一个数据结构,通常在执行过程中作为中间数据,传递给上层进行处理。node指针和ps指针指向同一个位置,所以类型转换前,node能读取ScanState的信息,类型转换后,node只能读取PlanState的信息。本篇文章中,我学习了TupleTableSlot结构体、ScanState结构体以及ExecSeqScan函数的作用。语句是完全被允许的,并且类型转换后,node视作PlanState*类型使用,并只能访问ps所指向的内容。

2023-10-16 23:49:18 68 1

原创 executor 算子统述

这篇文章中,我介绍了火山模型将查询执行树的每一个节点抽象成一个算子,每一个算子代表一类操作(选择、投影、扫描等)。算子的执行是查询执行的关键,无论哪一个算子出现问题,都会导致查询执行结果错误。本篇文章中,我根据算子的不同用途将opengauss中大部分算子分门归类,总共分成四类:扫描算子、控制算子、物化算子、连接算子。接下来的文章中,我将具体地解析这些算子。接下来的几篇文章里,我将学习查询执行过程中的各个算子。扫描算子一般位于执行树的叶子结点,通过扫描操作获取表数据作为执行树PlanTree的数据输入。

2023-10-16 23:46:31 28 1

原创 SQL 查询执行总体流程(4)

至此,我们学习了与portal相关的执行过程,总体DML语句的执行逻辑框架如下图所示。最底层调用为各个算子,接下来的文章里,我将学习各个算子的执行过程。

2023-10-16 23:45:41 37 1

原创 SQL 查询执行总体流程(3)

如果portal对应的语句还没有被执行过(portal->holdStore字段为空),并且不是PORTAL_ONE_SELECT语句,则调用FillPortalStore函数执行查询并将结果加载到portal的存储元组中。在代码清单1中的第98行~128行代码中,我发现unique_sql字符串频繁出现,我查找了相关资料,发现opengauss数据库执行过程的一个精妙之处。本篇文章对PortalRun函数做了简要的分析,学习了Portal对象的持久性和非持久性连接,并对UNIQUE SQL有了一定了解。

2023-10-16 23:45:07 38

原创 SQL 查询执行总体流程(2)

在opengauss数据库查询过程中,需要不断对某些任务分配内存,而这些分配的内存需要显示释放,因此很容易造成内存泄漏,经过时间的累计,存储空间会被耗尽。而内存上下文方法就应运而生了,对于某一个SQL语句,会给这个语句分配一个内存上下文,此SQL语句执行过程中,不再直接调用malloc函数申请内存,而是从内存上下文中申请。中,我学习了查询执行过程总体的函数调用,并对CreatePortal函数有了初步的了解。本篇文章里,我学习了内存上下文的逻辑结构及其作用,并学习了PortalStart函数的大致功能。

2023-10-16 23:44:31 27 1

原创 SQL 查询执行总体流程(1)

明明do{······}while(0)语句和{······}语句是等效的,那为什么还要使用前者呢,这不是平白增加代码的复杂度和不可读性吗?本节简单分析了SQL语句查询执行过程中的函数调用,并对CreatePortal函数做了简要解析,发现了opengauss源码里对于提升代码健壮性的一个方法——do{······}while(0)语句。当想使用临时变量,不想对外部代码块的变量造成干扰时,可以考虑使用do{······}while(0)语句,在{}内定义的变量作用于仅局限于{}内,不会对外部产生影响。

2023-10-16 23:43:54 36 1

原创 SQL executor解读 查询执行模型概述

执行器根据查询优化阶段产生的查询优化树,对其进行物理实现,例如对每一个结点进行初始化,分配内存等操作,将其转为查询执行树。注意:查询执行过程和查询执行树的建立过程是同时的,并不存在先生成查询执行树,再查询执行。这一节讲述了从查询语句到生成查询执行树所经历的过程,opengauss所采用的火山模型,得知查询执行模块是对查询优化模块所生成的执行计划树进行操作。查询优化树是一种对查询语法树进行优化后的形式,它利用一些等价变换规则和启发式规则,对查询语法树进行重组,剪枝等操作,以减少查询的执行代价。

2023-10-16 23:42:53 196 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除