更新时间:2025-03-13 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个线程。