- 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 实效。