- 博客(80)
- 收藏
- 关注
原创 openGauss之NestedLoop Join内表 Reuse
openGuass支持在做nestloop的时候,支持通过Materialize的方式将内表缓存到内存中,然后外表的数据内表数据进行碰撞的时候,如果内表已经缓存了数据,那么直接从缓存中直接读取内表的数据,从而实现内部数据Reuse。如下所示,不Reuse内表时内部的数据需要读三遍才能完成Join操作,但是内部数据Reuse时,只需要读取一遍即可。
2024-09-17 15:36:30 507
原创 opeGauss 之BitmapOr算子代码走读
在openGauss中,BitmapOr算子扫描是指谓词条件是索引列的or条件时,将多个or条件的索引谓词先组成一个需要扫描元组的BitmapOr扫描算子,然后再通过BitmapOr算子的tid信息去扫描元组,从而减少or条件带来的随机扫描过多的问题,如下所示:本文主要通过走读代码了解openGauss是怎么实现BitmapOr算子的功能的。
2024-09-14 22:03:08 552
原创 openGauss之TidScan
在openGauss中,TidScan是指过滤谓词中包含ctid信息时,不再全表扫描然后通过eqal比对的方式进行计划,而是通过那到ctid谓词,直接通过tid获取到元组,然后再应用其他的过滤条件来过滤通过ticd获取到的元组。如下所示:本文主要讲述代码中是如何实现tidscan的。
2024-09-08 23:17:59 490
原创 openGauss 之索引回表
在openGauss中如果表有索引信息,查询的谓词条件中又包含索引列,openGauss支持通过索引信息快速拿到需要访问元组的位置信息,然后直接到该位置上取出元组数据,称之为回表查询。如下所示,利用索引索引列id=55快速找到t111上对应元组的位置信息,然后通过位置信息拿到id为55的元组中所有列的数据。本文通过走读openGauss的代码了解openGauss是怎样实现回表查询的。
2024-09-07 23:00:44 576
原创 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 776
原创 openGauss 之谓词下推代码走读
谓词下推是每一个SQL引擎必备的功能。本文主要通过走读代码了解openGauss中是如何实现谓词下推能力的。谓词下推即是将过滤条件尽可能往tablescan的数据源节点下推,以实现上层算子尽可能少计算的能力,如下所示的执行计划便已经将谓词id
2024-08-26 00:30:21 448
原创 openGauss之系统隐藏列
openGauss在建表时,系统会自动插入tableoid,cmax,xmax,cmin,xmin,ctid 六个系统隐藏列,在select*的时候也会自动隐藏这6个系统隐藏列,如下所示:本文主要走读代码了解openGauss是如何实现系统隐藏列的功能的。
2024-08-24 23:15:06 535
原创 openGauss 之blks_hit统计实现的代码走读
在openGauss中,select * from pg_stat_database可以看到每个数据库缓存命中率(blks_hit)的统计,如下所示:本文主要走读openGauss的代码来了解openGuass是在怎样进行缓存命中率的统计的。
2024-08-18 22:56:44 1022
原创 openGuass之shared_buffers代码走读
openGauss中的shared_buffers的配置项其实指的是共享缓冲区的大小,主要是用于配置缓冲数据块的大小。本文主要是通过走读代码了解在openGuass中shared_buffers的作用原理。
2024-07-08 23:36:07 529 1
原创 openGauss 之min/max 优化代码走读
在openGuass中,如果对索引列执行max/min操作,openGauss会优化成只读取索引的最前/后的一行数据,避免了对整表数据进行读取和聚合操作,如下所示: 1. 首先需要将min/max 算子转成成执行计划中降序/升序的keypath,代码流程如下所示: 2. 生成索引路径的时候,根据keypath的信息生成顺序扫描路径还是逆序扫描路径,主要代码如下所示: 3. add_path的时候将带有pathkey的路径保存下来,主要代码流程如下所示:
2024-04-14 00:11:07 593
原创 OpenGuass 之 where 1 = 0 处理流程代码走读
在OpenGuass中,如果where 条件中包含where 1= 0 等固定为否条件的查询语句,在生成执行计划的时候,执行计划是BaseResult类型,此类型的执行计划不会进行物理数据扫描,如下所示:对于非固定为否条件(如where id = 1)的语句,对应的执行计划则是SeqScan,此类计划会先执行物理扫描数据,扫描数据后在根据谓词条件进行优化,如下所示:本文主要是通过代码走读来了解在OpenGuass中对于where 1 = 0的固定为伪条件的处理流程。
2024-03-03 19:30:39 605
原创 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 689
原创 OpenGauss 之PartitionMap
本文主要是讲述OpenGuass中是如何将pg_partition系统表中的分区信息初始化成PartitionMap的。
2024-01-27 00:00:20 706
原创 OpenGuass 之顺序扫描和索引扫描的代价估算
在OepnGuass中,一条路径的执行代价估算值将直接决定一条路径是否会被取舍。本文主要对OpenGuass中对于普通表的顺序扫描和索引扫描两种路径的的代价估算进行代码走读了解代价估算的整体过程。
2024-01-07 19:30:22 695
原创 OpenGauss 之索引查找和匹配
本文主要通过走读OpenGuass的代码,来了解查询的时候OpenGuass是如何查找表的索引信息以及根据谓词条件过滤掉无用的索引信息的。
2024-01-01 15:16:53 839
原创 Presto 之 Query & Stage的几种状态
当query被submit到resourceGroupManager后,query的状态变成WAITING_FOR_RESOURCES,WAITING_FOR_RESOURCES的状态主要为等待足够的worker个数,当worker的个数足够后,状态转为DISPATCHING状态。:QUEUED状态是query的初始状态,当CN收到查询的时候,会首先将该查询的状态置为QUEUED状态,QUEUED的查询会等待resource-group有可运行资源后进入到WAITING_FOR_RESOURCES阶段。
2023-09-16 23:55:35 709
原创 Presto 之Pipeline
我们知道在Presto中有个叫Pipeline的概念,Pipeline其实就是一条包含各个算子的流水线,如下所示。本文主要介绍在Presto中,Pipeline是如何划分的。
2023-09-03 23:39:00 774
原创 Presto之Driver个数
在Presto的Stage Performace中,每个Operator中都会有Driver个数的显示,如下图所示。本文主要介绍Presto中是如何决定Driver的个数的。
2023-08-27 20:52:22 831
原创 Presto之Union算子的实现
在Presto中,Union的算子包括自动去重的Union操作和不去重的Union All操作。本文主要简述在Presto中Union All算子是如何实现和Union算子中是如何实现数据去重的。
2023-08-14 23:27:32 1166
原创 Presto RBO之ReorderJoins
在Presto中,ReorderJoins 的优化规则是指遍历Join表的各种顺序和类型的组合,在所有的组合中找到一个执行代价最小的执行计划来执行。ReorderJoins 是Join操作最重要的优化规则,本文主要介绍在Presto中,ReorderJoins 是如何实现的。
2023-07-24 00:17:08 979
原创 Presto 之Semi Join的实现
在Presto中,select xxx from xxx where xxx in (select xxx from xx) 这种形式的SQL会被转成成Semi Join执行,通过xxx与子查询Join并且保留xxx的值实现in的过滤功能。本文主要介绍Semi Join在Presto中是如何实现的。
2023-07-19 23:50:09 902
原创 Presto之内存池管理
在Presto 之GENERAL POOL & RESERVED POOL_王飞活的博客-CSDN博客的文章中,我们介绍了在Presto中,内存分成了保留区和通用区两个内存池区进行管理。本文则主要介绍Presto是是如何实现内存池管理的。
2023-07-09 19:16:25 1131
原创 Presto 之GENERAL POOL & RESERVED POOL
我们知道,在Presto中,查询内存的分GENERAL内存池内存和RESERVED内存池内存。本文主要讲述在Presto中GENERAL POOL和RESERVED POOL的划分意义以及大小计算。
2023-07-05 00:35:34 1233
原创 Presto 之Cross Join消除的实现
Cross Join是指无条件的join。因为Cross Join的代价为笛卡尔乘积,代价很大,因此在Presto的执行优化中,会尽量消除掉Cross Join。Presto Cross Join的消除原理主要是尽可能通过对Join表的重新排序实现将Cross Join转换为Inner Join。本文主要讲述在Presto中是如何实现Cross Join消除的。
2023-06-25 23:44:19 1295
原创 Presto之 hash_partition_count
其实在Presto中,hash_partition_count的意义是限制一个Stage最多可以在多少个worker节点上运行,hash_partition_count超过Worker的总数量时此参数不起作用。hash_partition_count也不是对所有类型的Stage都可以生效,只有对可拆分成多个Task运行 的Stage才生效,比如Partition Join, Order by等算子,对于TableScan,TaskOutput等不可拆分运行的Stage,此参数不起作用。
2023-06-04 14:17:30 1460
原创 Presto之BroadCast Join的实现
在Presto中,Join的类型主要分成Partitioned Join和Broadcast Join,在Presto 之Hash Join的Partition_王飞活的博客-CSDN博客中已经介绍了Presto的Partitioned Join的实现过程,本文主要介绍Broadcast Join的实现。
2023-05-27 23:10:04 2272
原创 Presto之 Exchange和访问MetaStore的反压机制
反压(backoff)是指网络请求如果失败时,将适当削弱访问的请求流量,避免造成更大拥塞。在Presto中,支持Exchange和MetaStore两种请求的自动反压,本文主要介绍在Presto中,这两种反压是如何实现的。
2023-05-24 00:23:25 1666
原创 Presto 之Blocked Time
在Presto的UI中,可以看到每一个查询的每一个算子的各种汇总的统计信息,比如输入输出数据量,端到端时间,阻塞时间等,如下所示:本文主要介绍在Presto中,Blocked Time的含义以及在Presto中Block Time是怎么实现的。
2023-05-08 00:15:39 2026
原创 Presto 之Hash Join的Partition
在Presto中,当两表Join为Hash Join并且join_distribution_type为PARTITIONED的时候,Presto会将Build表分区(Partition)后再进行Join操作。
2023-04-30 23:10:56 3132
原创 Presto之Left Join和Right Join的实现
我们知道,在Presto中,与inner join相比,left join会保留probe表(左表)的所有值,right join会保留build表(右表)的所有值。inner join的是实现在文章Presto之Hash Join 数据碰撞的实现过程_王飞活的博客-CSDN博客中已经介绍,本文主要是介绍在Presto中,Left Join和Right Join的实现和它们Inner Join的实现过程的区别。
2023-04-29 11:13:53 3232
原创 Presto之Hash Join 数据碰撞的实现过程
本文主要叙述在Presto中,Hash Join是怎么做相同key值的碰撞和最后Join结果的生成的实现原理的。其实在Presto中数据碰撞在文章从构建到使用,openLooKeng 如何实现 Hash Join?_openLooKeng的博客-CSDN博客已经描述的非常清楚了。本文主要是基于此文章的基础上,补充一些关键步骤的代码段便于理解。
2023-03-31 00:13:54 2197
原创 Presto之hive.hdfs.impersonation.enabled & hive.hdfs.wire-encryption.enabled
如果hive.hdfs.impersonation.enabled=false,则Presto将直接使用hive.hdfs.presto.principal设置的用户与hdfs进行交互,所以如果新建文件,文件的数组将为hive.hdfs.presto.principal用户。2. hive.hdfs.impersonation.enabled的实现原理是通过创建访问Hdfs的Ugi来控制的。
2023-02-12 23:37:31 2256
原创 Presto 之SQL到Operator转换过程的代码走读
在Presto中,Operator是真正具备计算能力的算子。本文主要通过代码走读来理解在Presto中如何将SQL语句一步一步转换到Operator执行算子的。在Presto中,整体的转换过程为SQL语句 -> Statement -> RelationPaln -> LogicalPlanner -> fragmentedPlan -> Operator。如下为其实现过程的代码走读。
2023-02-05 11:06:44 2415
原创 Presto 之Hive数据源Batch Read功能代码走读
在Presto中通过数据源的Connector读取数据的时候,返回来的是Page,一个Page中包含每列数据Block,Block中会包含多行数据。本文主要是通过Presto源码走读了解在Presto的Hive Connector中是如何通过Batch Read实现到Hive数据源取Page的时候进行多行数据读取功能的实现过程。
2023-01-13 23:47:19 2498 1
原创 Presto 之 BTreeIndex 索引代码走读
本文主要介绍在Presto(OpenLookeng)中的BTree索引的代码实现。关于BTree索引原理的介绍可以参考官网资料。
2022-12-31 22:10:22 2610
原创 Presto 之Bitmap索引代码走读
本文承接Presto(OpenLookeng)之BloomFilter索引优化代码走读_王飞活的博客-CSDN博客一文继续通过走读代码介绍Presto(其实是OpenLookeng)中的另外一种索引:Bitmap索引的实现过程。在Presto中,Bitmap索引的官网介绍可以参考。
2022-12-17 00:02:22 2255
原创 Presto(OpenLookeng)之BloomFilter索引优化代码走读
本文计划通过走读代码来理解Presto(其实是OpenLookeng)中BloomFilter索引的建立以及Presto中利用BloomFilter索引对查询进行优化的执行流程。。
2022-12-10 00:08:08 2400
原创 Presto 之 explain and explain analyze的实现
本文主要探索在Presto中Explain功能是如何实现的。在Presto中,Explain用法有两种,一种是单纯的explain,此场景只会显示经过RBO优化后的执行计划,但是查询并不会真正地执行。第二种是explain analyze,此场景会真正执行查询,而且打印出来的执行计划是真正运行的执行计划。不仅如此,explain analyze还包含各个stage的时间等,信息比单独的explain丰富。
2022-11-22 00:21:40 3026
原创 Presto 聚合中groupBy分组的实现
本文只要探索在Presto中groupby是怎么实现的。在Preso中,groupby的分组主要通过对数据Hash的数值比较进行分组,其中有2种情况,一直是仅有一个groupby字段而且字段是Bigint类型的,此场景下会使用BigintGroupByHash来实现分组,其他的情况则使用MultiChannelGroupByHash实现多列分组。
2022-11-19 13:36:34 2479
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人