SMP适用场景与限制
背景信息
SMP(Symmetric Multi-Processing,对称多处理)特性通过算子并行来提升性能,同时会占用更多的系统资源,包括CPU、内存、网络、I/O等等。本质上SMP是一种以资源换取时间的方式,在合适的场景以及资源充足的情况下,能够起到较好的性能提升效果;但是如果在不合适的场景下,或者资源不足的情况下,反而可能引起性能的劣化。SMP特性适用于分析类查询场景,这类场景的特点是单个查询时间较长,业务并发度低。通过SMP并行技术能够降低查询时延,提高系统吞吐性能。然而在事务类大并发业务场景下,由于单个查询本身的时延很短,使用多线程并行技术反而会增加查询时延,降低系统吞吐性能。
适用场景
- 支持并行的算子:计划中存在以下算子支持并行。
- Scan:支持行存普通表和行存分区表顺序扫描;支持GDS数据导入的外表扫描并行。以上均不支持复制表。
- Join:HashJoin、NestLoop。
- Agg:HashAgg、SortAgg、PlainAgg、WindowAgg(只支持partition by,不支持order by)。
- Stream:Redistribute、Broadcast。
- 其他:Result、Subqueryscan、Unique、Material、Setop、Append、VectoRow、RowToVec。
- SMP特有算子:为了实现并行,新增了并行线程间的数据交换Stream算子供SMP特性使用。这些新增的算子可以看做Stream算子的子类。
- Local Gather:实现DN内部并行线程的数据汇总。
- Local Redistribute:在DN内部各线程之间,按照分布键进行数据重分布。
- Local Broadcast:将数据广播到DN内部的每个线程。
- Local RoundRobin:在DN内部各线程之间实现数据轮询分发。
- Split Redistribute:在集群跨DN的并行线程之间实现数据重分布。
- Split Broadcast:将数据广播到集群所有DN的并行线程。
上述新增算子可以分为Local与非Local两类,Local类算子实现了DN内部并行线程间的数据交换,而非Local类算子实现了跨DN的并行线程间的数据交换。
- 示例说明,以TPCH Q1的并行计划为例:
在这个计划中,实现了Scan以及HashAgg算子的并行,并且新增了Local Gather和Split Redistribute数据交换算子。
其中6号算子为Split Redistribute算子,上面标有的“dop: 4/4”表明Split Redistribute的发送端和接收端线程的并行度均为4。4号算子为Local Gather,上面标有“dop: 1/4”,该算子的发送端线程并行度为4,而接收端线程并行度为1,即下层的5号Hash Aggregate算子按照4并行度执行,而上层的1~3号算子按照串行执行,4号算子实现了DN内并行线程的数据汇总。
通过计划Stream算子上标明的dop信息即可看出各个算子的并行情况。
非适用场景
- 不支持CN上的算子并行。
- 不支持不能下推的查询并行执行。
- 不支持子查询subplan和initplan的并行,以及包含子查询的算子并行。
- 会触发trigger的查询不支持并行。
- CTE查询不支持并行执行。
- 语句中调用STABLE或VOLATILE属性的函数,且该函数为非SHIPPABLE类型,该语句不支持SMP并行执行。
