Page 446 - 《软件学报》2025年第12期
P. 446
韩瑞琛 等: NUMA-conscious 外键连接优化技术 5827
LLC 缓存哈希表/向量, CPU LLC 大小及访问性能对连接性能有直接的影响. 当前 CPU 发展的一个显著趋势是持
续增大 LLC 大小, 如 ICX(38) 的 L3 cache 容量达到 57 MB, ARM(64) 达到 64 MB, AMD Zen2/Zen3 达到 256 MB,
Fujitsu A64FX 集成了 32 GB 的 HBM2 以及 Intel Sapphire Rapids 集成 64 GB HBM2 扩大缓存容量. 前期研究固定
的连接负载, 因而无法揭示连接性能受硬件技术发展的影响, 也无法体现在真实应用场景下连接负载的需求 (如通
过物化 (SSB) 及冗余外键 (TPC-DS) 消除大表连接代价, 真实的维表缓慢及非线性增长等).
本文提出的 MJB 连接基准不仅用于评估不同连接算法的性能特征, 还能够进一步揭示不同连接算法性能与
不同 CPU 架构之间的相关性. 随着晶体管集成度的持续提升, CPU LLC 容量增幅迅速, 连接算法因相对于不同
cache 层次的依赖性可能导致性能相对优势发生变化. MJB 连接基准不仅能客观全面地给出不同连接算法的性能
特征, 还能进一步给出连接算法性能和硬件技术的相关性, 从硬件发展的维度预测未来连接算法性能的趋势, 为数
据库提供更加全面的性能预测方法.
2 NUMA-conscious 连接算法设计
本节讨论 NUMA-conscious 连接算法实现技术, 在连接算法上聚焦于 NPO 算法和向量连接算法, 相对于
PRO 算法内存消耗更低, 而且可以更好地支持现代流水线处理和向量化处理模型, 在 OLAP 多表连接场景的查询
处理中具有更大的应用价值.
2.1 NUMA-conscious 分区
NUMA 架构上理想的存储策略是将输入表均匀分布在各 NUMA 节点之间, 本地线程访问本地 NUMA 节点
分区数据. 为避免 NUMA 节点内存分配的偏斜, 将 numactl 的内存分配策略设置为--interleave=all, 使操作系统在
各 NUMA 节点之间采用轮询均匀分配内存. 这种分配策略适用于 NUMA-oblivious 算法, 在 NUMA-conscious 算
法中可能存在线程跨 NUMA 节点的内存访问延迟.
NUMA-conscious 分区需要磁盘-内存一体化设计策略, 来保证表数据加载到内存时在 NUMA 节点间均匀分
布. 图 3 显示了该分区策略, 原始表为行存储结构, 加载到内存转换为列存储结构, 即将行存储表划分为固定记录
行数的行组 (row group) 并将行组转换为列存储结构, 不同的连接场景需要不同的 NUMA 分区策略.
Rows to load Row-group chunks Radix-group chunks NUMA nodes
PK-FK PK-FK
... ... ...
图 3 NUMA-conscious 分区方法
2.1.1 单表分区策略
当连接操作中 R 表很小而 S 表很大时, 可以采用简单的跨 NUMA 共享哈希表或共享向量连接算法, 此时仅需
要将 S 表在 NUMA 节点间均匀分布, 最大化利用内存带宽性能. 这种 NUMA 分区场景适用于典型数据仓库和 OLAP
应用中的星形模型, 如 SSB 和 TPC-DS 中单一庞大的事实表和多个较小的维表模式. 在数据加载阶段, 事实表数
据以列结构行组为粒度均匀分布在 NUMA 节点间, 同一 NUMA 节点的 CPU 线程访问行组列数据分片, 最大化 S
表扫描的 NUMA 局部性. 基于单表分区策略的跨 NUMA 共享哈希表或共享向量连接算法见算法 1.

