数据中RBO和CBO超级详细的对比说明

以下内容对比了数据库中的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. 核心差异对比

特性RBOCBO
判断依据预定义规则(规则优先级、访问路径等级)统计信息(表、索引统计、系统资源)
灵活性低,不随数据变化自动调整;需手工变更规则或提示(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。
  • 统计管理:需定期执行 ANALYZEDBMS_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. 结论

  1. RBO 以规则为核心,适用于历史兼容与小规模场景,但已被各大厂商弃用或仅供回退。
  2. CBO 以成本为导向,依托统计信息实现更精准的执行计划选择,是现代数据库的主流优化器。
  3. 生产环境中应以 CBO 为主,并关注统计信息质量与 Hint 使用,以获得最佳查询性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值