
上篇我们讲述了一个执行计划是如何生成的,这次我们来看下这个生成的执行计划是被 Optimizer 优化的。
概述
Optimizer,优化器,顾名思义就是一个用来优化执行计划的组件。数据库的优化器通常分为两类,一类是基于规则的优化器 RBO(Rule-basd optimizer),一类是基于代价的优化 CBO(Cost-based optimizer),前者完全基于预设的优化规则进行优化,匹配的条件和优化的结果都比较固定;后者则会根据收集的数据统计信息计算不同执行计划的执行代价,尽量选择代价最小的执行计划。
目前 Nebula Graph 主要实现得是 RBO,所以本文也主要集中讲述 Nebula Graph 中的 RBO 实现。
源码定位
优化器的源码实现都在src/optimizer目录下面,其中的文件结构如下所示:
.
├── CMakeLists.txt
├── OptContext.cpp
├── OptContext.h
├── OptGroup.cpp
├── OptGroup.h
├── Optimizer.cpp
├── Optimizer.h
├── OptimizerUtils.cpp
├── OptimizerUtils.h
├── OptRule.cpp
├── OptRule.h
├── rule
│ ├── CombineFilterRule.cpp
│ ├── CombineFilterRule.h
│ ├── EdgeIndexFullScanRule.cpp
│ ├── EdgeIndexFullScanRule.h
| ....
|
└── test
├── CMakeLists.txt
├── IndexBoundValueTest.cpp
└── IndexScanRuleTest.cpp
其中test目录是测试,rule目录则是预设的规则集,其他的源文件则是优化器的具体实现。
而优化器优化查询的入口则在src/service/QueryInstance.cpp文件中,如下所

本文介绍了NebulaGraph数据库中的优化器(Optimizer)工作原理,主要关注基于规则的优化器(RBO)。优化器通过预设规则对执行计划进行优化,减少执行代价。文章详细阐述了优化器的源码结构,优化过程以及如何添加新的优化规则。以Limit下推为例,展示了规则的定义和转换过程。
最低0.47元/天 解锁文章
476

被折叠的 条评论
为什么被折叠?



