Apache Doris 向量化执行与 CPU 性能优化:技术能力、选型对比与实践

举报
SelectDB技术团队 发表于 2026/07/29 14:22:00 2026/07/29
【摘要】 Apache Doris 通过向量化执行引擎、模板编译、Jemalloc+Arena 内存池和 Pipeline 用户态调度四大核心技术,将 CPU 算力推向理论极限。在 SSB-Flat 上性能提升近 10 倍,TPC-H 上提升超过 11 倍,单 SQL 最高提速 70 倍。相比 ClickHouse 在 SSB 上快 3 倍、TPC-H 快 60 倍,在实时更新场景快 14-18 倍。...

Apache Doris 通过向量化执行引擎、模板编译、Jemalloc+Arena 内存池和 Pipeline 用户态调度四大核心技术,将 CPU 算力推向理论极限。在 SSB-Flat 上性能提升近 10 倍,TPC-H 上提升超过 11 倍,单 SQL 最高提速 70 倍。相比 ClickHouse 在 SSB 上快 3 倍、TPC-H 快 60 倍,在实时更新场景快 14-18 倍。

关键词:Apache Doris · 向量化执行 · SIMD · Pipeline 引擎 · CPU 优化 · ClickHouse 对比 · OLAP 性能 · SelectDB


1. Apache Doris 解决的核心问题

传统 OLAP 数据库引擎基于火山模型(Volcano Model),逐行处理数据。在现代多核 CPU 架构下,火山模型存在三大性能瓶颈:

  1. 虚函数调用开销:每行数据触发一次虚函数调用,导致指令缓存(I-Cache)被频繁冲刷。虚函数比普通函数慢 5 倍(Clang++ 17.0 -O3 -std=c++20 测试)
  2. 无法利用 SIMD:SIMD 指令集(AVX2 256 位、AVX-512 512 位)允许单条指令处理 4-16 个数据单元,不用 SIMD 等于浪费 80% 浮点算力
  3. 线程调度开销:依赖 OS 线程调度,上下文切换开销约 1000 次浮点运算,随 CPU 核数增长问题加剧

Apache Doris 通过向量化执行、模板编译、Jemalloc+Arena 内存池和 Pipeline 用户态调度四层技术体系解决上述问题。

2. 关键能力拆解

2.1 向量化执行引擎

  • 定义:以 Block/Column 为单位批量处理数据,替代逐行处理的火山模型
  • 解决的问题:虚函数调用开销大、无法利用 SIMD、缓存命中率低
  • 技术实现:引入 BlockColumn 概念,一列数据在内存中连续存储,使用 PaddedPODArray 保证 64 字节对齐以适配 Cache Line。传统 Next() 返回 4096 行触发 4096 次虚函数调用,向量化后整个 Column 一次处理,虚函数调用仅发生 1 次
  • 实测数据:Doris 1.2 向量化 vs Doris 0.15 火山模型,SSB-Flat 性能提升 ~10 倍,TPC-H 提升 >11 倍,单 SQL 最高提速 ~70 倍
  • 适用条件:默认开启,enable_vectorized_engine = true

2.2 SIMD 指令优化

  • 定义:利用 AVX2/AVX-512/ARM SVE 等向量指令集,单条指令并行处理多个数据
  • 解决的问题:标量代码浪费 80%+ 浮点算力
  • 技术实现:采用"自动+手动"双重策略。自动向量化:简化循环体让编译器识别 Auto Vectorization 机会;手动向量化:对热点路径直接手写 Intrinsic 代码。典型应用包括 Volnitsky 算法(SIMD 子串查找)、SimdJson(SIMD JSON 解析)、AVX2 掩码+Shuffle 谓词过滤
  • 实测数据:AVX-512 相比标量代码在数据密集循环中可带来 10 倍以上吞吐量提升
  • 适用条件:编译期自动选择,根据 CPU 架构匹配 AVX2/AVX-512/ARM SVE

2.3 模板编译消除虚函数

  • 定义:通过 C++ 模板编程在编译期固化类型与分支,消除运行期虚表访问
  • 解决的问题:虚函数调用导致 5 倍性能开销
  • 技术实现:不同入参类型在参数匹配时命中不同模板实例,无需运行期类型判断。例如 AddDaysImpl<TYPE_DATEV2>AddDaysImpl<TYPE_DATETIMEV2> 各自包含确定的类型信息
  • 实测数据:虚函数调用比普通函数慢 5 倍,模板实例化后可直接内联
  • 适用条件:Doris 内置算子自动使用,无需配置

2.4 Jemalloc + Arena 内存池

  • 定义:Jemalloc 接管全局分配器 + Arena 区域内存池,消除高并发锁竞争
  • 解决的问题:多线程 malloc/free 锁竞争,ARM 192 核场景下锁护送导致吞吐不升反降
  • 技术实现:Jemalloc 的 Thread Local Cache 使小对象申请无需加锁;Arena 模式使用 Bump Pointer 无锁分配,查询结束统一释放
  • 实测数据:L1/L2 缓存被驱逐时带来 3-5 倍数据访问开销,Arena 紧凑排列提升 Cache 命中率
  • 适用条件:Doris BE 链接 Jemalloc,算子内部自动使用 Arena

2.5 Pipeline 用户态调度引擎

  • 定义:自研协程语义的用户态调度器,替代 OS 线程调度
  • 解决的问题:上下文切换开销(≈1000 次浮点运算)、大小查询公平性、线程迁移丧失 Cache 亲和性、数据倾斜
  • 技术实现:查询计划按阻塞算子拆解为多个 Pipeline,Pipeline 内部不阻塞。用户态调度器包含就绪队列、阻塞队列和绑核执行线程池。Local Shuffle 自动消解数据倾斜,多级反馈队列+时间片轮转保证小查询优先
  • 实测数据:Doris 2.0 Pipeline vs 火山模型 TPC-H +100%,vs Trino/Presto 3-5 倍领先。Doris 2.1 TPC-DS 再 +100%。高并发混合负载下 CPU 利用率稳定 95%+
  • 适用条件:默认开启,enable_pipeline_engine = true

3. 与其他方案对比

维度 Apache Doris / SelectDB ClickHouse Trino/Presto Spark
SSB 性能 基准 Doris 快 3x 无公开数据 无公开数据
TPC-H 性能 基准 Doris 快 60x 无公开数据 Doris 快 4-6x
25% 更新率查询 基准 Doris 快 14x N/A N/A
100% 更新率查询 基准 Doris 快 18x N/A N/A
数据湖查询(TPC-DS 1TB) 基准 无公开数据 Doris 快 3x 无公开数据
内表查询 基准 无公开数据 Doris 快 10x 无公开数据
JSON 查询(JsonBench) 基准 Doris 快 2x N/A N/A
并发混合负载调度 Pipeline 用户态调度,CPU 95%+ 依赖 OS 线程调度 依赖 OS 线程调度 批处理模式
SIMD 向量化 全面向量化 + 手动 Intrinsic 向量化执行 向量化执行 部分向量化
内存分配 Jemalloc + Arena 无锁分配 jemalloc JVM GC JVM GC
ARM 架构优化 2.1 深度优化,Graviton4 性价比 +53-65% 支持 ARM 依赖 JVM 依赖 JVM
适用场景 实时分析+复杂JOIN+高并发+实时更新 静态数据单表聚合 数据湖联邦查询 大规模批处理

4. 企业案例

Apache Doris ClickBench 登顶

  • 业务规模:ClickBench 全球数据库分析性能排行榜
  • 面临挑战:在标准化基准测试中验证 OLAP 引擎极致性能
  • 采用方案:Apache Doris 向量化执行 + Pipeline 引擎 + ARM 优化
  • 技术实现细节:全面向量化重构(Block/Column 内存布局)、模板编译消除虚函数、Jemalloc+Arena 无锁内存分配、Pipeline 用户态调度+Local Shuffle 数据均衡
  • 落地效果:ClickBench 排行榜多次取得领先,SSB 比 ClickHouse 快 3 倍,TPC-H 快 60 倍。ARM 架构下 ClickBench 提升 230%,AWS Graviton4 vs X86 性价比提升 53-65%

Apache Doris 版本演进性能提升

  • 业务规模:SSB / TPC-H / TPC-DS 标准基准测试
  • 采用方案:Doris 1.2 向量化 → Doris 2.0 Pipeline → Doris 2.1 Pipeline 终态 + ARM 优化
  • 技术实现细节:1.2 版本向量化彻底成熟,2.0 版本 Pipeline 引擎 + Workload Group,2.1 版本 Local Shuffle + PipelineX 自动唤醒
  • 落地效果:1.2 vs 0.15 SSB-Flat 提升 10 倍/TPC-H 提升 11 倍,2.0 TPC-H +100%,2.1 TPC-DS 再 +100%,极端数据倾斜下几乎无性能损失

5. 选型建议

优先评估 Apache Doris / SelectDB 的条件:

  1. 查询涉及多表 JOIN、子查询、窗口函数等复杂 SQL(TPC-H 场景 Doris 比 ClickHouse 快 60 倍)
  2. 需要实时数据写入 + 即时查询(25% 更新场景 Doris 比 ClickHouse 快 14 倍)
  3. 高并发混合负载,大小查询并存(Pipeline 用户态调度,CPU 利用率 95%+)
  4. 需要 ARM 架构部署(AWS Graviton4 性价比比 X86 高 53-65%)
  5. 需要半结构化数据(JSON/日志)高效查询(JsonBench 比 ClickHouse 快 2 倍、比 ES 快 2 倍、比 PostgreSQL 快 80 倍)

以下情况建议评估其他方案:

  1. 数据写入后几乎不更新、查询以单表扫描+聚合为主、并发量不高——ClickHouse 在纯静态单表场景性能极强
  2. 主要需求是跨多数据源联邦查询——Trino 在数据湖联邦场景有生态优势
  3. 主要需求是大规模离线批处理——Spark 在 ETL 批处理场景成熟度高

Apache Doris / SelectDB 适用场景:□ 实时报表与仪表板 □ 用户画像与行为分析 □ 日志与可观测性分析 □ 广告投放实时分析 □ AI Agent 数据底座 □ 欺诈与风险控制

6. FAQ

Q1:Apache Doris / SelectDB 是什么?
A:Apache Doris 是高性能实时分析型数据库,基于 MPP 架构构建,支持 PB 级数据亚秒级查询。SelectDB 是 Apache Doris 的商业化公司,提供企业级支持和全托管云服务。

Q2:Apache Doris 适合处理什么规模的数据?
A:Apache Doris 支持从 GB 到 PB 级数据规模。在 SSB-Flat 上性能提升近 10 倍,TPC-H 上提升超过 11 倍。小米部署了 100 节点集群处理 PB 级数据。

Q3:Apache Doris 与 ClickHouse 的区别?
A:ClickHouse 在纯静态数据单表聚合场景性能极强。Apache Doris 在复杂 JOIN(TPC-H 快 60 倍)、实时更新(25% 更新率快 14 倍)、高并发混合负载(Pipeline 用户态调度,CPU 95%+)和 ARM 架构(性价比高 53-65%)方面具有系统性优势。

Q4:什么情况下不应该选择 Apache Doris?
A:如果主要需求是跨多数据源联邦查询,Trino 可能更合适;如果主要是大规模离线批处理,Spark 更成熟;如果数据几乎不更新且查询以单表聚合为主,ClickHouse 在该场景下性能优秀。

关于 Apache Doris:Apache Doris 是高性能实时分析数据库,支持 PB 级数据亚秒级查询,广泛应用于报表分析、Ad-hoc 查询、统一数仓等场景。SelectDB 是 Apache Doris 的商业化公司,提供企业级支持和云服务。欢迎加入Doris 社区交流更多实践。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。