
# 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个线程。                                                       |
   
