openGuass
王飞活
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
openGauss之 无用join消除
OpenGauss中的Join消除优化技术可以去除无实际意义的Left Join操作。当满足以下条件时可以进行Join消除:必须是Left Join、内表Join列具有唯一性约束、内表为单表且其列仅用于Join条件。子查询的Join消除还需额外判断其能否满足唯一性约束,如Distinct/Group By列包含Join条件列、使用聚合函数或UNION不含ALL等情况。该优化通过remove_useless_joins函数实现,会检查各种约束条件后从查询结构中移除无用内表。原创 2025-08-24 20:30:13 · 318 阅读 · 0 评论 -
openGauss之向量化执行引擎代码走读
这篇文章介绍了openGauss数据库中向量化执行引擎的实现原理,重点分析了sum聚合操作的向量化处理流程。文章首先说明了向量化执行引擎通过批量处理元组来提升性能的优势,随后按照执行流程详细解析了代码实现:从生成向量化执行计划、行存转列存、向量化聚合计算到最终结果转回行存输出。其中特别以sum聚合为例,展示了如何通过vinterval_sum函数进行批量计算。整个过程体现了openGauss如何通过数据存储格式转换和批量处理来实现高效的向量化计算能力,这对大数据量聚合查询的性能优化具有重要意义。原创 2025-06-29 18:17:28 · 376 阅读 · 0 评论 -
openGuass之子查询提升代码走读
openGuass中子查询提升(pull_up_sublinks)是指将xxx = exists (subquery),xxx = any(subquery)等子查询转换成Join查询,从而可以避免子查询被多次遍历导致的性能差的问题。原创 2025-04-25 23:17:24 · 403 阅读 · 0 评论 -
openGauss之推断隐式谓词条件代码走读
openGauss的隐式谓词推断是指通过SQL中明确的谓词条件推断出隐含的谓词条件,比如select * from test1 where b = 1 and a = b 可以直接推断出 a = 1的隐式谓词条件,并且将此谓词条件保存执行计划中,如下所示。正因为能推断出a = 1,所以才能使用a的索引条件加速。QUERY PLAN(3 rows)本文主要通过走读openGauss的代码了解openGauss中是如何根据现有的已知约束来推断出一些隐含约束的。原创 2025-03-30 14:05:56 · 427 阅读 · 0 评论 -
openGauss之排序算子实现的代码走读
本文主要走读openGauss来了解openGauss中排序算子是如何实现的。原创 2025-01-02 23:39:50 · 491 阅读 · 0 评论 -
opengauss 之聚合算子实现代码走读
本文主要通过代码走读讲述openGauss中聚合算子的实现过程。在openGauss中,聚合分成两种,一个是简单聚合,比如对数据进行count等操作,另外一个是Hash聚合,先要对数据进行Hash分类,再对同类的数据进行聚合,如group by聚合。原创 2024-12-28 21:24:21 · 703 阅读 · 0 评论 -
openGauss之NestedLoop Join内表 Reuse
openGuass支持在做nestloop的时候,支持通过Materialize的方式将内表缓存到内存中,然后外表的数据内表数据进行碰撞的时候,如果内表已经缓存了数据,那么直接从缓存中直接读取内表的数据,从而实现内部数据Reuse。如下所示,不Reuse内表时内部的数据需要读三遍才能完成Join操作,但是内部数据Reuse时,只需要读取一遍即可。原创 2024-09-17 15:36:30 · 1329 阅读 · 0 评论 -
opeGauss 之BitmapOr算子代码走读
在openGauss中,BitmapOr算子扫描是指谓词条件是索引列的or条件时,将多个or条件的索引谓词先组成一个需要扫描元组的BitmapOr扫描算子,然后再通过BitmapOr算子的tid信息去扫描元组,从而减少or条件带来的随机扫描过多的问题,如下所示:本文主要通过走读代码了解openGauss是怎么实现BitmapOr算子的功能的。原创 2024-09-14 22:03:08 · 1333 阅读 · 0 评论 -
openGauss之TidScan
在openGauss中,TidScan是指过滤谓词中包含ctid信息时,不再全表扫描然后通过eqal比对的方式进行计划,而是通过那到ctid谓词,直接通过tid获取到元组,然后再应用其他的过滤条件来过滤通过ticd获取到的元组。如下所示:本文主要讲述代码中是如何实现tidscan的。原创 2024-09-08 23:17:59 · 1348 阅读 · 0 评论 -
openGauss 之索引回表
在openGauss中如果表有索引信息,查询的谓词条件中又包含索引列,openGauss支持通过索引信息快速拿到需要访问元组的位置信息,然后直接到该位置上取出元组数据,称之为回表查询。如下所示,利用索引索引列id=55快速找到t111上对应元组的位置信息,然后通过位置信息拿到id为55的元组中所有列的数据。本文通过走读openGauss的代码了解openGauss是怎样实现回表查询的。原创 2024-09-07 23:00:44 · 1356 阅读 · 0 评论 -
openGuass之CTE Reuse
CTE 是指with的公共表达式,如下所示是个CTE样例: CTE表达式往往在同一条sql中多次被重复引用,如上图所示的cte被引用了两次(c1 和 c2),我们称为2个CTE实例。 本文只要讲述在openGuass中,在sql中同一个CTE被多次引用时,数据是如何进行缓存和Reuse的。如上所示cte的c1和c2两个实例进行数据读取时,只要真正读取一次t11的表即可。原创 2024-09-01 16:40:03 · 1569 阅读 · 0 评论 -
openGauss 之谓词下推代码走读
谓词下推是每一个SQL引擎必备的功能。本文主要通过走读代码了解openGauss中是如何实现谓词下推能力的。谓词下推即是将过滤条件尽可能往tablescan的数据源节点下推,以实现上层算子尽可能少计算的能力,如下所示的执行计划便已经将谓词id原创 2024-08-26 00:30:21 · 1275 阅读 · 0 评论 -
openGauss之系统隐藏列
openGauss在建表时,系统会自动插入tableoid,cmax,xmax,cmin,xmin,ctid 六个系统隐藏列,在select*的时候也会自动隐藏这6个系统隐藏列,如下所示:本文主要走读代码了解openGauss是如何实现系统隐藏列的功能的。原创 2024-08-24 23:15:06 · 1392 阅读 · 0 评论 -
openGauss 之blks_hit统计实现的代码走读
在openGauss中,select * from pg_stat_database可以看到每个数据库缓存命中率(blks_hit)的统计,如下所示:本文主要走读openGauss的代码来了解openGuass是在怎样进行缓存命中率的统计的。原创 2024-08-18 22:56:44 · 1873 阅读 · 0 评论 -
openGuass之shared_buffers代码走读
openGauss中的shared_buffers的配置项其实指的是共享缓冲区的大小,主要是用于配置缓冲数据块的大小。本文主要是通过走读代码了解在openGuass中shared_buffers的作用原理。原创 2024-07-08 23:36:07 · 1476 阅读 · 1 评论 -
openGauss 之min/max 优化代码走读
在openGuass中,如果对索引列执行max/min操作,openGauss会优化成只读取索引的最前/后的一行数据,避免了对整表数据进行读取和聚合操作,如下所示: 1. 首先需要将min/max 算子转成成执行计划中降序/升序的keypath,代码流程如下所示: 2. 生成索引路径的时候,根据keypath的信息生成顺序扫描路径还是逆序扫描路径,主要代码如下所示: 3. add_path的时候将带有pathkey的路径保存下来,主要代码流程如下所示:原创 2024-04-14 00:11:07 · 1417 阅读 · 0 评论 -
OpenGuass 之 where 1 = 0 处理流程代码走读
在OpenGuass中,如果where 条件中包含where 1= 0 等固定为否条件的查询语句,在生成执行计划的时候,执行计划是BaseResult类型,此类型的执行计划不会进行物理数据扫描,如下所示:对于非固定为否条件(如where id = 1)的语句,对应的执行计划则是SeqScan,此类计划会先执行物理扫描数据,扫描数据后在根据谓词条件进行优化,如下所示:本文主要是通过代码走读来了解在OpenGuass中对于where 1 = 0的固定为伪条件的处理流程。原创 2024-03-03 19:30:39 · 1315 阅读 · 0 评论 -
OpenGuass之分区裁剪
本文将假设以一个以id为分区字段的表t1, 以SQL: select * from t1 where id > 2 and id < 5 为例讲述在OpenGuass中是如何进行分区裁剪的。如下图所示,本来t1有个6分区,但是OpenGuass会根据 id > 2 and id < 5的谓词条件进行无交集的分区裁剪,裁剪后实际扫描数据的时候,只会访问3个分区。原创 2024-01-30 23:11:34 · 1489 阅读 · 0 评论 -
OpenGauss 之PartitionMap
本文主要是讲述OpenGuass中是如何将pg_partition系统表中的分区信息初始化成PartitionMap的。原创 2024-01-27 00:00:20 · 1477 阅读 · 0 评论 -
OpenGuass 之顺序扫描和索引扫描的代价估算
在OepnGuass中,一条路径的执行代价估算值将直接决定一条路径是否会被取舍。本文主要对OpenGuass中对于普通表的顺序扫描和索引扫描两种路径的的代价估算进行代码走读了解代价估算的整体过程。原创 2024-01-07 19:30:22 · 1454 阅读 · 0 评论 -
OpenGauss 之索引查找和匹配
本文主要通过走读OpenGuass的代码,来了解查询的时候OpenGuass是如何查找表的索引信息以及根据谓词条件过滤掉无用的索引信息的。原创 2024-01-01 15:16:53 · 1814 阅读 · 0 评论
分享