CodeWalk

Doris向量化执行引擎

作者:我是大山 · 2026-05-30 12:55

请介绍Doris的向量化执行引擎(Vectorized Execution Engine)的设计原理。向量化执行相比行式执行有哪些性能提升?Doris的向量化算子如何工作?如何排查向量化执行中的性能问题?

回答

我是大山

1. 向量化执行原理

Doris的向量化引擎基于批处理SIMD指令优化:

行式:逐行处理,每次处理一条记录
向量化:每次处理一批数据(Batch/Column Block),利用CPU Cache Local

核心思想

// 行式伪代码
for (row in rows):
    sum += row.price * row.quantity

// 向量化伪代码
price_col = column_vector(rows, "price")
qty_col = column_vector(rows, "quantity")
total = price_col * qty_col  // SIMD指令一次计算整列

2. 性能提升

维度行式引擎向量化引擎
吞吐量100-500 MB/s1-5 GB/s
CPU利用率低(分支预测失败多)高(连续内存访问)
多线程扩展中等优秀
复杂聚合快5-10x

3. 向量化算子

  • Scan算子:列式读取,按Batch返回
  • HashJoin算子
    • 构建哈希表(批量插入)
    • 探测时使用SIMD加速Hash计算
  • 聚合算子
    • 批量分组聚合
    • 使用固定大小HashTable减少内存碎片
  • 排序算子
    • 多列排序使用Column-wise比较

4. 排查性能问题

-- 查看执行计划
EXPLAIN SELECT ...;

-- 开启Profile
SET enable_profile = true;

-- 检查是否使用向量化
EXPLAIN VERBOSE SELECT sum(price) FROM orders;
-- 算子节点应显示 VOlapScanNode / VHashJoinNode

常见问题

  • 数据转换开销:String类型频繁转换
  • 内存瓶颈:HashTable过大导致Cache Miss
  • 谓词下推不足:Scan层过滤不充分

5. 配置优化

# be.conf
# 启用向量化引擎(默认启用)
enable_vectorized_engine = true
# 调整Batch大小
batch_size = 4096