详解GaussDB(DWS)中的行执行引擎

💡 原文中文,约4200字,阅读约需10分钟。
📝

内容提要

本文介绍了GaussDB(DWS)行执行引擎的组成和功能,包括扫描算子、连接算子、物化算子和控制算子。行执行引擎是查询的执行者,负责从存储引擎中读取数据并进行处理。文章还介绍了行执行引擎的执行框架和常见算子。

🔎

延伸解读

行执行引擎的适用场景与优势

行执行引擎主要应用于行存表,适合频繁的增删改查操作。在点查场景下,行存储可以直接通过索引定位到某行数据的元组位置,点查性能好;同时,行存储在实时并发入库和并发更新方面也有较大优势。因此,对于OLTP场景中数据需要频繁更新、增删改操作多,且查询结果涉及表的多列时,行执行引擎是合适的选择。

三类连接算子的选择考量

连接算子包括嵌套循环、哈希连接和归并连接。嵌套循环连接适用于外表结果集小的场景,当内表使用索引时可以快速定位连接元组;哈希连接要求连接两端为类型相同的等值连接,且支持哈希散列,适用于内表可放入内存且列重复值和倾斜不多的场景;归并连接要求内外表有序,适用于内外表已经有序、不需要重新排序的情况。选择时需根据数据特征和查询条件权衡。

物化算子的作用与常见类型

物化算子用于缓存元组,因为许多物理操作需要先获取所有元组才能进行处理,例如聚集函数操作、没有索引辅助的排序等。常见的物化算子包括Material(物化)、Sort(排序)、Group(分组)、Agg(聚集)、WindowAgg(窗口函数)、Unique(去重)、Hash(哈希连接辅助)、SetOp(集合操作)和LockRows(行级锁)。这些算子帮助执行引擎高效地完成复杂计算。

分布式查询中的其他算子

在分布式查询计划中,除了扫描、连接、物化和控制算子外,还有Stream算子和RemoteQuery等。Stream算子用于多节点间的数据交换,包括Gather(汇聚)、Broadcast(广播)和Redistribute(重分布)三种类型。此外,Partition Iterator用于分区表扫描,RowToVec用于行列混合场景,DfsScan/DfsIndexScan用于HDFS表扫描。这些算子支持GaussDB(DWS)在分布式环境下的高效执行。

❓

Q&A

GaussDB(DWS)的行执行引擎主要负责什么?

行执行引擎负责从存储引擎中读取数据并进行处理,是查询的执行者。

行执行引擎的基本单位是什么?

行执行引擎的基本单位是算子,查询计划以树的形式存在。

行执行引擎中有哪些常见的算子?

常见的算子包括扫描算子、连接算子、物化算子和控制算子。

扫描算子的作用是什么?

扫描算子用于扫描表中的数据,获取元组作为上层节点的输入。

连接算子有哪些实现方式?

连接算子的实现方式包括嵌套循环连接、哈希连接和归并连接。

物化算子的主要用途是什么?

物化算子用于缓存元组,适用于需要获取所有元组的操作。

🏷️

标签

➡️

继续阅读