目录标题
以下内容对比了数据库中的Rule-Based Optimizer (RBO) 与 Cost-Based Optimizer (CBO) 的原理、演进、核心差异、优缺点及使用场景,助您深入理解二者的异同与选型考量。
概述
RBO(Rule-Based Optimizer)依赖预定义的启发式规则对 SQL 语句进行访问路径排序与选择,历史悠久但缺乏灵活性和自适应能力 (asktom.oracle.com, Oracle Docs);
CBO(Cost-Based Optimizer)则基于对象的实际统计信息(表行数、索引基数、数据分布等)评估多种执行计划的“成本”,选择最小成本者,适应性强,已成为现代数据库的主流优化方式 (asktom.oracle.com, CelerData)。
1. 定义与原理
1.1 RBO(Rule-Based Optimizer)
- 原理:RBO 按照一组固定的规则为可用访问路径分配“等级”,优先选择等级最低(最快)的路径执行查询 (Oracle Docs)。
- 执行流程:RBO 不依赖任何运行时统计;只要索引可用,就倾向于使用索引扫描,否则执行全表扫描 (CelerData)。
1.2 CBO(Cost-Based Optimizer)
- 原理:CBO 对 SQL 语句生成的所有可能执行计划进行成本估算,考虑 CPU、I/O、内存等资源消耗,并选择估算成本最低的计划 (CelerData)。
- 统计依赖:CBO 需要依赖数据库统计信息(表行数、列基数、数据分布、块大小、系统资源参数等)来进行准确的成本估算 (oracle-base.com)。
2. 演进与历史
- Oracle 早期版本:Oracle 9i 之前仅支持 RBO,优化器完全基于规则执行 (Oratable)。
- CBO 引入与淘汰:从 Oracle 8 引入 CBO,引擎默认切换到 CBO;Oracle 10g 起正式废弃 RBO,仅在显式指定或无统计信息时才会回退到 RBO (Oratable, oracle-base.com)。
- 跨厂商演进:现代主流数据库(Oracle、SQL Server、PostgreSQL、MySQL 等)均已放弃纯 RBO,全面采用或强化 CBO (Niraj Bhatt - Architect’s Blog)。
3. 核心差异对比
特性 | RBO | CBO |
---|---|---|
判断依据 | 预定义规则(规则优先级、访问路径等级) | 统计信息(表、索引统计、系统资源) |
灵活性 | 低,不随数据变化自动调整;需手工变更规则或提示(HINT) | 高,随统计信息更新自动优化 |
代价评估 | 无真实代价计算,仅按规则排序 | 真实评估 CPU、I/O、内存等资源消耗 |
维护成本 | 维护简单,但不易扩展和精细化 | 需定期收集和维护统计,需额外资源 |
典型场景 | 简单查询、小规模数据;仅作兼容或测试 | 复杂查询、大数据量;OLTP/OLAP 等应用场景 |
默认启用 | 已废弃(仅旧版或无统计信息时生效) | 主流数据库默认启用 |
4. 优缺点分析
4.1 RBO 优缺点
-
优点
- 实现简单,计算开销低 (Medium)。
- 对小表或简单查询足够,且无需统计维护。
-
缺点
- 固定规则难以适应数据或查询变化,可能选出次优或极差的执行计划 (Veritas)。
- 不支持复杂的查询转换(如基于基数或成本的联接排序),对大数据量表现差 (Oracle PLSQL 提示)。
4.2 CBO 优缺点
-
优点
- 基于实时统计,能够对多种执行方案进行定量评估,选出最优方案 (CelerData)。
- 支持复杂优化(如基于成本的联接重排序、并行执行、物化视图匹配等)。
-
缺点
- 需额外开销收集和维护统计信息;统计不准确时反而可能导致次优方案 (oracle-base.com)。
- 对于极端复杂的查询,优化时间可能较长,规划开销增大 (Medium)。
5. 使用场景与配置
5.1 RBO 启用方式
- 显式指定:可通过
/*+ RULE */
Hint 强制使用 RBO (oracle-base.com)。 - 无统计回退:若对象无统计或统计被标记为未知,老版本 Oracle 会自动回退到 RBO (oracle-base.com)。
5.2 CBO 启用与优化
- 默认启用:主流版本中,数据库默认使用 CBO。
- 统计管理:需定期执行
ANALYZE
或DBMS_STATS.GATHER_*_STATS
收集统计 (oracle-base.com)。 - 调优技巧:使用
DBMS_STATS.SET_*_PREFERENCE
精细控制统计采集;利用 Hint(/*+ ALL_ROWS */
、/*+ FIRST_ROWS(n) */
)引导优化目标 (Oracle Forums)。
6. 实践示例
示例:选择最佳联接顺序
- 在未收集统计时,RBO 可能按索引可用性简单联接;
- 收集统计后,CBO 会根据表大小、索引选择性、联接基数等因素,动态评估并选出成本最低的联接顺序 (CelerData, oracle-base.com)。
7. 结论
- RBO 以规则为核心,适用于历史兼容与小规模场景,但已被各大厂商弃用或仅供回退。
- CBO 以成本为导向,依托统计信息实现更精准的执行计划选择,是现代数据库的主流优化器。
- 生产环境中应以 CBO 为主,并关注统计信息质量与 Hint 使用,以获得最佳查询性能。