更新时间:2025-05-29 GMT+08:00
Stream
算子说明
Stream是GaussDB的SMP(对称多处理)中使用的一种技术,SMP采用多线程并行算法,在算子内并行执行,充分利用现代服务器单机多核的特点,提高执行效率。SMP分为计划生成与执行两部分:
- SMP计划生成。一阶段计划生成:在路径生成阶段,加入并行路径,最终根据代价,决定所选择的计划。两阶段计划生成:第一步生成原有的串行计划,第二步再将串行计划改造成适应并行的计划 。
- SMP执行过程。为并行执行线程之间进行数据分配、交换和汇总。
SMP的执行依赖Stream算子,不同类型的Stream算子配合完成SMP的执行过程。Stream算子的集中式类型主要分为:
- Local Gather :DN内数据分配,实现DN内部并行线程的数据汇总。
- Local Redistribute :DN内数据分配,在DN内部各线程之间,按照分布键进行数据重分布。
- Local Broadcast : DN内数据分配,将数据广播到DN内部的每个线程。
- Local RoundRobin :DN内数据分配,在DN内部各线程之间实现数据轮询分发。
GaussDB通过broadcast与redistribute对数据进行多线程处理,然后通过gather汇总数据并处理返回。
典型场景
设置query_dop大于1的查询并行度。
示例
示例:设置query_dop大于1的查询并行度
--数据准备。 gaussdb=# CREATE TABLE t1 ( id int, number int); CREATE TABLE gaussdb=# INSERT INTO t1 VALUES (generate_series(1, 500000), 1); INSERT 0 500000 gaussdb=# CREATE TABLE t2 (id int, number int); CREATE TABLE gaussdb=# INSERT INTO t2 VALUES (generate_series(250000, 750000), 1); INSERT 0 500001 gaussdb=# SET query_dop = 4; SET --执行结果。 gaussdb=# EXPLAIN SELECT * FROM t1,t2 WHERE t1.id = t2.id; QUERY PLAN ----------------------------------------------------------------------------------------------------------- Streaming(type: LOCAL GATHER dop: 1/4) (cost=14971.50..33394.63 rows=408830 width=16) -> Hash Join (cost=14971.50..32097.07 rows=408830 width=16) Hash Cond: (t1.id = t2.id) -> Streaming(type: LOCAL REDISTRIBUTE dop: 4/4) (cost=0.00..15303.62 rows=500000 width=8) -> Seq Scan on t1 (cost=0.00..4725.50 rows=500000 width=8) -> Hash (cost=13693.90..13693.90 rows=408830 width=8) -> Streaming(type: LOCAL REDISTRIBUTE dop: 4/4) (cost=0.00..13693.90 rows=408830 width=8) -> Seq Scan on t2 (cost=0.00..4497.57 rows=408830 width=8) (8 rows) gaussdb=# explain select * from t1,t2 where t1.id > 250000; QUERY PLAN ------------------------------------------------------------------------------------------------- Streaming(type: LOCAL GATHER dop: 1/4) (cost=2518.31..643988111.08 rows=102235709270 width=16) -> Nested Loop (cost=2518.31..319509541.62 rows=102235709270 width=16) -> Streaming(type: BROADCAST dop: 4/4) (cost=2518.31..18197.05 rows=1000276 width=8) -> Seq Scan on t1 (cost=2518.31..5038.00 rows=250069 width=8) Filter: (id > 250000) -> Materialize (cost=0.00..5008.61 rows=408830 width=8) -> Seq Scan on t2 (cost=0.00..4497.57 rows=408830 width=8) (7 rows) --删除。 gaussdb=# DROP TABLE t1,t2;
上述示例中,Stream算子输出信息如下所示。
信息名称 |
含义 |
---|---|
Streaming |
算子的名称。 |
Type |
Stream算子的类型。Gather 代表并行线程的数据汇总。Redistribute 代表各线程之间,按照分布键进行数据重分布。Broadcast代表数据广播到DN内部的每个线程。 |
dop |
Stream算子的并行度。示例中 dop: 4/4代表使用了全部4个线程。 |
父主题: 其他关键字