Doris向量化执行引擎
请介绍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/s | 1-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