- Parallel query execution 面临的问题:
- 即使拥有精确的数据统计信息,由于 modern out-of-order cores 也很难将查询任务**均匀地分布在多个核心上**
- 问题:负载失衡、上下文切换瓶颈,但是无法 scale
- NUMA
- morsel-driven query execution framework:
- **scheduling** 是一个 NUMA-aware 的 fine-grained runtime **task**
- 将 input data 的小碎片(即 morsels)调度到 worker threads
- worker threads 允许整个 operator pieplines 直到下一个 pipeline breaker
- **并行度**没有固定在 plan 中,而是可以在执行时**动态调整**
- dispatcher 感知 NUMA-local morsels 和 operator state 的 **data locality**
- NUMA 架构下,多核并行需要考虑 RAM 和 cache 层次结构。
- 特别地,需要考虑线程大多数情况在 **NUMA-local** data 之上工作。
- Volcano model:可以称为是 **plan-driven**
- optimizer 在 query compile-time 时**静态**决定分配多少线程,为每个线程实例化一个 query operator plan,然后使用 exchange operators 连接它们。
- **morsel-driven**
- 为内存数据库 Hyper 设计的
- <img src="https://img.jonahgao.com/oss/note/2025p1/morsel_paper_idea.png" height="auto" />
- 在不同的核心上并行地处理每个 pipeline
- 查询切分成 segments,每个 executing segment 以一个 morsel (例如 100,000个 input tuples)作为输入执行,然后在下一个 pipeline breaker 里物化执行结果
- NUMA-local procesing:
- 一个线程操作 NUMA-local 的 input,然后写入结果到 NUMA-local storage area。
- dispatcher 运行**固定数量**(依赖机器)的线程,且线程 **Pin** 到 cores 上,避免 OS move thread 导致 NUMA locality 实效。