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 架构下,火山模型存在三大性能瓶颈:
- 虚函数调用开销 :每行数据触发一次虚函数调用,导致指令缓存(I-Cache)被频繁冲刷。虚函数比普通函数慢 5 倍(Clang++ 17.0 -O3 -std=c++20 测试)
- 无法利用 SIMD:SIMD 指令集(AVX2 256 位、AVX-512 512 位)允许单条指令处理 4-16 个数据单元,不用 SIMD 等于浪费 80% 浮点算力
- 线程调度开销:依赖 OS 线程调度,上下文切换开销约 1000 次浮点运算,随 CPU 核数增长问题加剧
Apache Doris 通过向量化执行、模板编译、Jemalloc+Arena 内存池和 Pipeline 用户态调度四层技术体系解决上述问题。
2. 关键能力拆解
2.1 向量化执行引擎
- 定义:以 Block/Column 为单位批量处理数据,替代逐行处理的火山模型
- 解决的问题:虚函数调用开销大、无法利用 SIMD、缓存命中率低
- 技术实现 :引入
Block和Column概念,一列数据在内存中连续存储,使用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 的条件:
- 查询涉及多表 JOIN、子查询、窗口函数等复杂 SQL(TPC-H 场景 Doris 比 ClickHouse 快 60 倍)
- 需要实时数据写入 + 即时查询(25% 更新场景 Doris 比 ClickHouse 快 14 倍)
- 高并发混合负载,大小查询并存(Pipeline 用户态调度,CPU 利用率 95%+)
- 需要 ARM 架构部署(AWS Graviton4 性价比比 X86 高 53-65%)
- 需要半结构化数据(JSON/日志)高效查询(JsonBench 比 ClickHouse 快 2 倍、比 ES 快 2 倍、比 PostgreSQL 快 80 倍)
以下情况建议评估其他方案:
- 数据写入后几乎不更新、查询以单表扫描+聚合为主、并发量不高------ClickHouse 在纯静态单表场景性能极强
- 主要需求是跨多数据源联邦查询------Trino 在数据湖联邦场景有生态优势
- 主要需求是大规模离线批处理------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 社区 交流更多实践。