Doris(Apache Doris)的优化器采用基于成本的优化策略(Cost-Based Optimization, CBO),结合规则优化(Rule-Based Optimization, RBO),以生成高效的分布式执行计划。以下是其核心优化策略:
采用CBO(基于代价优化)、RBO(基于规则优化)和HBO(基于历史优化)相结合的优化策略。RBO支持常量折叠、子查询重写和谓词下推等优化,CBO支持Join Reorder等优化,HBO能够基于历史查询信息推荐最优执行计划。
1. 基于代价的优化(CBO)
- 统计信息收集 :
通过收集表、列、分区的基数(Cardinality)、数据分布直方图等统计信息,评估不同执行计划的代价。 $$ \text{代价} = f(\text{CPU}, \text{内存}, \text{网络IO}, \text{磁盘IO}) $$ - 代价模型 :
综合计算节点资源消耗、数据倾斜等因素,选择预估代价最低的执行计划。
2. 查询重写(Query Rewrite)
- 谓词下推(Predicate Pushdown) :
将过滤条件(如WHERE子句)提前至存储层执行,减少数据传输量。 - 投影下推(Projection Pushdown) :
仅读取查询所需的列,避免全列扫描。 - 子查询优化 :
将相关子查询转换为JOIN操作,或利用物化视图加速计算。
3. 分布式执行计划优化
- 数据本地化(Data Locality) :
优先将计算任务调度到存储数据的节点,减少网络传输。 - 并行执行(Parallelism) :
对JOIN、AGGREGATE等操作拆分到多个节点并行处理。 - 动态分区裁剪 :
根据查询条件跳过无关分区(如时间分区),仅扫描必要数据。
4. 索引策略
- 智能索引(Smart Index) :
自动为高频过滤字段(如主键)创建索引,加速点查。 - 前缀索引(Prefix Index) :
对复合查询条件(如WHERE col1=? AND col2=?)建立联合索引。
5. 列式存储优化
- 列裁剪(Column Pruning) :
仅读取查询涉及的列,减少 I/O 开销。 - 延迟物化(Late Materialization) :
延迟行数据的拼接,在过滤后生成完整行。
6. 资源与并发控制
- 资源组(Resource Group) :
为不同任务分配 CPU、内存配额,避免资源抢占。 - 查询优先级 :
支持高优先级查询插队执行,保障关键任务。
7. 执行引擎优化
- 向量化引擎(Vectorized Execution) :
批量处理数据,减少函数调用开销。 - Pipeline 并行 :
将算子拆分为流水线阶段,提升吞吐量。
总结
Doris 的优化器通过统计信息驱动代价评估、分布式计划优化、存储层协同等策略,显著提升复杂查询效率。用户可通过 EXPLAIN 命令查看执行计划,并结合统计信息收集(如 ANALYZE TABLE)确保优化效果。