
OceanBase 数据库的 “从行到向量” 技术,核心是执行引擎层面的向量化优化 —— 区别于 AI 领域常用的 “向量” 数据类型,它是通过按批处理数据(而非传统按行迭代)提升 SQL 执行效率的执行层优化方案。这一技术虽不直接等同于 AI 的数据载体,但能为 AI 发展提供关键的数据处理支撑:
AI 模型的训练与推理依赖大规模高质量数据的高效预处理(如特征工程、数据清洗、统计分析等 AP 场景任务),而 OceanBase 从行到向量的技术重构,大幅提升了大规模数据的分析处理能力 —— 例如在 TPCH 30T 数据集测试中,向量化执行模式相比传统单行执行,整体性能提升 2.48 倍,计算密集型查询(如 Q1)性能提升超 10 倍。这种高效的数据处理能力,可快速完成 AI 所需的海量数据预处理工作,缩短数据到模型的流转周期;同时,向量化技术对现代 CPU 特性(如 SIMD 指令、Cache 优化)的充分利用,能支撑 AI 场景下高并发、高吞吐量的数据查询需求,为 AI 应用提供稳定、高效的底层数据存储与计算底座,间接推动 AI 技术在实际业务中的落地与发展。
OceanBase 向量化执行引擎以 “按批迭代” 为核心,相比传统火山模型(按行迭代),具备三大核心优势,是提升 AP 能力的关键支撑,也为 2021 年 OceanBase TPCH 打榜夺冠奠定了重要基础:
传统火山模型中,每个算子需通过get_next_row()接口逐行拉取数据,1 亿行数据需调用 1 亿次该接口,虚函数调用频繁,CPU 资源浪费严重。而向量化引擎通过get_next_batch()接口一次传递一批数据(一批数据行数由rowset参数定义,如rowset=16表示一批含 16 行数据),若一批数据为 1024 行,1 亿行数据仅需调用约 9.7 万次接口,调用次数大幅降低,显著节省 CPU 开销。
向量化引擎延续了火山模型 “算子组装” 的核心逻辑,查询计划仍可分解为多个独立算子,每个算子仅需关注自身批量数据处理逻辑,无需依赖其他算子的具体实现。例如在select count(*) from t1 where c1=1000查询中,LTABLE FULL SCAN算子批量读取数据并完成c1=1000的过滤,再将批量结果传递给SCALAR GROUP BY算子进行聚合,算子间耦合性低,同时批量处理又提升了整体效率。
针对 OLAP 场景中常见的大规模聚合、多表关联等复杂查询,向量化引擎的批量处理特性可有效降低数据在算子间的传递成本。例如多表 Join 查询中,批量数据可减少表间数据交互次数;复杂表达式计算(如concat(c1,c2))时,可对一批数据(如 256 行)集中计算,避免逐行计算的重复开销,进一步提升复杂查询的执行效率。
OceanBase 向量化执行引擎通过三层优化,深度适配现代 CPU 架构,最大化发挥 CPU 性能,实现对 CPU 的亲和支持:
向量化执行过程中,OceanBase 将批量数据按列组织并紧凑存储 —— 例如一批 256 行数据中,c1列的 256 个值连续存放,c2列的 256 个值连续存放。这种列式存储模式使数据具备极高的空间局部性:CPU 通过预取指令可将一批数据提前加载到 L2 Cache 中,后续计算无需频繁访问内存(减少memory stall);同时,算子函数批量处理连续数据,能降低 CPU DCache(数据缓存)和 ICache(指令缓存)的 Miss 率,提升 Cache 利用率。例如计算concat(c1,c2)时,c1和c2的批量连续数据可直接从 Cache 读取,避免反复从内存加载。
传统火山模型中,逐行处理数据需频繁进行条件判断(如if (A) eval_func_A() else if (B) eval_func_B()),256 行数据需执行 256 次判断,极易导致 CPU 分支预测失败 —— 一旦预测失败,CPU 需中断流水线并重新刷新,严重影响性能。OceanBase 向量化引擎将分支判断 “提至批量处理外层”,对一批数据仅执行 1 次条件判断,再批量执行对应逻辑,伪代码如下:
get_next_batch() {
if (A) {
for (auto row_no : 256) eval_func_A(); // 批量执行,无内部分支
} else if (B) {
for (auto row_no : 256) eval_func_B();
}
}
这种优化大幅减少分支预测失败次数,避免 CPU 流水线被破坏,提升 CPU 处理效率。
现代 CPU 普遍支持 SIMD(单指令多数据)技术,可通过一条指令同时处理多个数据元素。OceanBase 向量化引擎因数据连续存储,能直接将批量数据装载到 CPU 向量寄存器中,通过 SIMD 指令实现并行计算,减少 CPU 周期消耗。以 x86 架构的 SSE 指令集为例,处理整型向量逐元素相乘时,流程如下:
这种方式使 CPU 一次可处理 4 个数据元素,相比传统标量计算(一次 1 个数据),计算效率提升数倍,尤其适用于聚合、排序等计算密集型场景。
OceanBase 向量化执行技术的实践需围绕 “参数配置、性能验证、版本适配、场景落地” 四个维度展开,确保充分发挥向量优势,具体实践方案如下:
OceanBase 3.x、4.x 版本中,向量化相关核心参数(_rowsets_enabled:向量化开关;_rowsets_max_rows:每批数据最大行数)的默认值会根据系统资源(如 CPU 核心数、内存大小)和 SQL 类型(TP/AP)自适应调整,最佳实践是不手动修改这两个参数:
实践中可通过行业标准测试集(如 TPCH、TPDS)验证向量化执行的性能提升,典型测试结果如下:
测试时需注意:需先打开向量化开关(alter system set _rowsets_enabled = true),并确保查询计划中显示rowset参数(如rowset=16),表明向量化已生效。
OceanBase 4.x 版本对向量化执行引擎进行了核心重构 —— 优化中间数据结构(如支持定长 / 变长连续数据格式、分离 Sort Key 与非 Sort Key 物化结构),进一步降低 Cache Miss 率,提升算子(如 Sort、Join、聚合)的批量处理效率。相比 3.x 版本,4.x 版本在 AP 场景下额外带来 10%~20% 的性能提升,实践中建议优先升级至 4.x 版本,无需手动修改配置即可享受优化成果。
OceanBase 提供在线实验环境与社区资源,助力用户落地向量实践: