自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 openGauss 之min/max 优化代码走读

在openGuass中,如果对索引列执行max/min操作,openGauss会优化成只读取索引的最前/后的一行数据,避免了对整表数据进行读取和聚合操作,如下所示: 1. 首先需要将min/max 算子转成成执行计划中降序/升序的keypath,代码流程如下所示: 2. 生成索引路径的时候,根据keypath的信息生成顺序扫描路径还是逆序扫描路径,主要代码如下所示: 3. add_path的时候将带有pathkey的路径保存下来,主要代码流程如下所示:

2024-04-14 00:11:07 286

原创 OpenGuass 之 where 1 = 0 处理流程代码走读

在OpenGuass中,如果where 条件中包含where 1= 0 等固定为否条件的查询语句,在生成执行计划的时候,执行计划是BaseResult类型,此类型的执行计划不会进行物理数据扫描,如下所示:对于非固定为否条件(如where id = 1)的语句,对应的执行计划则是SeqScan,此类计划会先执行物理扫描数据,扫描数据后在根据谓词条件进行优化,如下所示:本文主要是通过代码走读来了解在OpenGuass中对于where 1 = 0的固定为伪条件的处理流程。

2024-03-03 19:30:39 325

原创 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 409

原创 OpenGauss 之PartitionMap

​ 本文主要是讲述OpenGuass中是如何将pg_partition系统表中的分区信息初始化成PartitionMap的。

2024-01-27 00:00:20 420

原创 OpenGuass 之顺序扫描和索引扫描的代价估算

在OepnGuass中,一条路径的执行代价估算值将直接决定一条路径是否会被取舍。本文主要对OpenGuass中对于普通表的顺序扫描和索引扫描两种路径的的代价估算进行代码走读了解代价估算的整体过程。

2024-01-07 19:30:22 402

原创 OpenGauss 之索引查找和匹配

本文主要通过走读OpenGuass的代码,来了解查询的时候OpenGuass是如何查找表的索引信息以及根据谓词条件过滤掉无用的索引信息的。

2024-01-01 15:16:53 434

原创 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 299

原创 Presto 之Pipeline

我们知道在Presto中有个叫Pipeline的概念,Pipeline其实就是一条包含各个算子的流水线,如下所示。本文主要介绍在Presto中,Pipeline是如何划分的。

2023-09-03 23:39:00 401

原创 Presto之Driver个数

在Presto的Stage Performace中,每个Operator中都会有Driver个数的显示,如下图所示。本文主要介绍Presto中是如何决定Driver的个数的。

2023-08-27 20:52:22 485

原创 Presto之Union算子的实现

在Presto中,Union的算子包括自动去重的Union操作和不去重的Union All操作。本文主要简述在Presto中Union All算子是如何实现和Union算子中是如何实现数据去重的。

2023-08-14 23:27:32 712

原创 Presto RBO之ReorderJoins

在Presto中,ReorderJoins 的优化规则是指遍历Join表的各种顺序和类型的组合,在所有的组合中找到一个执行代价最小的执行计划来执行。ReorderJoins 是Join操作最重要的优化规则,本文主要介绍在Presto中,ReorderJoins 是如何实现的。

2023-07-24 00:17:08 702

原创 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 806

原创 Presto之内存池管理

在Presto 之GENERAL POOL & RESERVED POOL_王飞活的博客-CSDN博客的文章中,我们介绍了在Presto中,内存分成了保留区和通用区两个内存池区进行管理。本文则主要介绍Presto是是如何实现内存池管理的。

2023-07-09 19:16:25 1056

原创 Presto 之GENERAL POOL & RESERVED POOL

我们知道,在Presto中,查询内存的分GENERAL内存池内存和RESERVED内存池内存。本文主要讲述在Presto中GENERAL POOL和RESERVED POOL的划分意义以及大小计算。

2023-07-05 00:35:34 1145

原创 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 1187

原创 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 1386

原创 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 2185

原创 Presto之 Exchange和访问MetaStore的反压机制

反压(backoff)是指网络请求如果失败时,将适当削弱访问的请求流量,避免造成更大拥塞。在Presto中,支持Exchange和MetaStore两种请求的自动反压,本文主要介绍在Presto中,这两种反压是如何实现的。

2023-05-24 00:23:25 1614

原创 Presto 之Blocked Time

在Presto的UI中,可以看到每一个查询的每一个算子的各种汇总的统计信息,比如输入输出数据量,端到端时间,阻塞时间等,如下所示:本文主要介绍在Presto中,Blocked Time的含义以及在Presto中Block Time是怎么实现的。

2023-05-08 00:15:39 1933

原创 Presto 之Hash Join的Partition

在Presto中,当两表Join为Hash Join并且join_distribution_type为PARTITIONED的时候,Presto会将Build表分区(Partition)后再进行Join操作。

2023-04-30 23:10:56 2989

原创 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 3072

原创 Presto之Hash Join 数据碰撞的实现过程

本文主要叙述在Presto中,Hash Join是怎么做相同key值的碰撞和最后Join结果的生成的实现原理的。其实在Presto中数据碰撞在文章从构建到使用,openLooKeng 如何实现 Hash Join?_openLooKeng的博客-CSDN博客已经描述的非常清楚了。本文主要是基于此文章的基础上,补充一些关键步骤的代码段便于理解。

2023-03-31 00:13:54 2118

原创 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 2167

原创 Presto 之SQL到Operator转换过程的代码走读

在Presto中,Operator是真正具备计算能力的算子。本文主要通过代码走读来理解在Presto中如何将SQL语句一步一步转换到Operator执行算子的。在Presto中,整体的转换过程为SQL语句 -> Statement -> RelationPaln -> LogicalPlanner -> fragmentedPlan -> Operator。如下为其实现过程的代码走读。

2023-02-05 11:06:44 2339

原创 Presto 之Hive数据源Batch Read功能代码走读

在Presto中通过数据源的Connector读取数据的时候,返回来的是Page,一个Page中包含每列数据Block,Block中会包含多行数据。本文主要是通过Presto源码走读了解在Presto的Hive Connector中是如何通过Batch Read实现到Hive数据源取Page的时候进行多行数据读取功能的实现过程。

2023-01-13 23:47:19 2416 1

原创 Presto 之 BTreeIndex 索引代码走读

本文主要介绍在Presto(OpenLookeng)中的BTree索引的代码实现。关于BTree索引原理的介绍可以参考官网资料。

2022-12-31 22:10:22 2545

原创 Presto 之Bitmap索引代码走读

本文承接Presto(OpenLookeng)之BloomFilter索引优化代码走读_王飞活的博客-CSDN博客一文继续通过走读代码介绍Presto(其实是OpenLookeng)中的另外一种索引:Bitmap索引的实现过程。在Presto中,Bitmap索引的官网介绍可以参考。

2022-12-17 00:02:22 2138

原创 Presto(OpenLookeng)之BloomFilter索引优化代码走读

本文计划通过走读代码来理解Presto(其实是OpenLookeng)中BloomFilter索引的建立以及Presto中利用BloomFilter索引对查询进行优化的执行流程。。

2022-12-10 00:08:08 2346

原创 Presto 之 explain and explain analyze的实现

本文主要探索在Presto中Explain功能是如何实现的。在Presto中,Explain用法有两种,一种是单纯的explain,此场景只会显示经过RBO优化后的执行计划,但是查询并不会真正地执行。第二种是explain analyze,此场景会真正执行查询,而且打印出来的执行计划是真正运行的执行计划。不仅如此,explain analyze还包含各个stage的时间等,信息比单独的explain丰富。

2022-11-22 00:21:40 2834

原创 Presto 聚合中groupBy分组的实现

本文只要探索在Presto中groupby是怎么实现的。在Preso中,groupby的分组主要通过对数据Hash的数值比较进行分组,其中有2种情况,一直是仅有一个groupby字段而且字段是Bigint类型的,此场景下会使用BigintGroupByHash来实现分组,其他的情况则使用MultiChannelGroupByHash实现多列分组。

2022-11-19 13:36:34 2305

原创 Presto 中orderby 算子的实现过程

本文主要介绍在Presto中orderby 算子是如何通过代码实现的。

2022-11-12 00:25:59 1877

原创 Presto RBO之 Sort算子优化

本文主要介绍在Presto中部分与Sort(order by)相关的RBO优化。

2022-11-05 00:38:22 1447

原创 Presto 动态过滤之 Connector应用动态过滤数据优化

本文将承接Presto 动态过滤之 动态过滤条件合并_王飞活的博客-CSDN博客继续通过代码走读来了解Presto(OpenLookeng)中动态过滤的数据生成后,在connector中是怎么应用优化的,也就是下图红框的部分。

2022-10-24 23:44:51 1331

原创 Presto 动态过滤之 动态过滤条件合并

本文将承接Presto 动态过滤之 动态过滤条件数据的生成_王飞活的博客-CSDN博客继续通过走读代码来了解在Presto(OpenLookeng)中DynamicFilterService中的动态过滤数据合并功能是如何实现的。

2022-10-22 11:00:53 1307

原创 Presto 动态过滤之 动态过滤条件数据的生成

本文主要通过走读代码来了解下图中Build这块功能的代码实现。在Presto(OpenLooKeng)中,动态过滤的过滤条件数据由生成Join算子中在生成Build表的时候生成,然后推送到分布式缓存中,供CN或者其他worker获取。下图来自OpenLookeng。

2022-10-16 22:22:36 1192

原创 Presto 动态过滤之计划生成

动态过滤子在Join的场景下可能会带来较好的性能提升,动态过滤的基本介绍可以参考openLooKeng基于选择率的动态过滤优化_openLooKeng的博客-CSDN博客。本文主要通过代码走读来了解Presto(其实是OpenLookeng)中执行计划中动态过滤部分是如何生成的,即下图中红框部分(图来自OpenLookeng)。

2022-10-15 15:11:06 902

原创 Presto RBO之broadcast join与partitioned join类型的选择优化

在Presto中,是选择broadcast还是partitioned的Join类型实现非常简单,就是将A join B的所有组合情况罗列一遍,然后求取每种情况的代价,选择代价最小的执行计划书执行,其实现代码在DetermineJoinDistributionType中实现。内存表在每个worker都是一份完整的拷贝;探测表在并行探测前需要重分布。

2022-10-09 23:58:00 745

原创 Presto RBO之调整表的join顺序

调整表的Join顺序是join操作性能优化的一个常见手段。一般SQL计算引擎都支持在Join计算的时候都能自动根据代价将小表调整到join的右侧,大表调整到join的左侧来进行计算从而获得良好的性能。本文通过走读代码来探索在Presto中是如何实现根据代价调整join计算时候的表顺序的。

2022-09-29 00:12:59 732 1

原创 Presto Split调度模型与调度时间分配

Presto Split调度模型与调度时间分配

2022-09-18 13:54:54 342

原创 Presto之Split的调度处理流程

Presto之Split的调度处理流程

2022-09-10 14:42:38 652

空空如也

空空如也

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

TA关注的人

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