Oracle Jonathan Lewis CBO 优化器原理

Oracle Jonathan Lewis CBO 优化器原理

来源:Jonathan Lewis / jonathanlewis.wordpress.com 适用版本:Oracle Database 8i+ 文档版本:v1.0 / 2026-07-22


1. 关于 Jonathan Lewis

Jonathan Lewis,Oracle ACE Director,世界知名 Oracle 性能专家[1]。

  • 著有《Cost-Based Oracle Fundamentals》《Oracle Core》
  • CBO 优化器权威
  • 博客:jonathanlewis.wordpress.com

2. CBO 基础

2.1 工作原理

- 解析 SQL
- 收集统计信息
- 计算成本
- 选择最低成本执行计划

2.2 成本模型

- Cost = CPU + I/O
- 9i:I/O 为主
- 10g+:CPU + I/O
- 12c+:增强

2.3 Jonathan 观点

- CBO 不神秘
- 理解原理
- 统计信息关键

3. 统计信息

3.1 表

- num_rows
- blocks
- avg_row_len

3.2 列

- num_distinct
- density
- num_nulls
- low/high_value
- 直方图

3.3 索引

- blevel
- leaf_blocks
- clustering_factor
- num_rows
- distinct_keys

3.4 Jonathan 强调

- 统计信息准确 = CBO 正确
- 理解每个字段
- 监控

4. 基数计算

4.1 单表

- 等值:1 / num_distinct
- 范围:(range_size) / (high - low)
- LIKE:固定比例

4.2 直方图

- Frequency:精确
- Height Balanced:评估
- Hybrid:12c+

4.3 Jonathan 公式

- 选择率 × num_rows = cardinality
- 理解选择率
- CBO 基础

5. 连接成本

5.1 Nested Loop

- 外表基数 × 内表成本
- 索引访问
- 小数据

5.2 Hash Join

- 构建表 Build
- 探测表 Probe
- 内存
- 大数据

5.3 Merge Join

- 排序
- 合并
- 已排序数据

5.4 Jonathan 分析

- 不同连接不同成本
- CBO 选择
- 理解

6. Clustering Factor

6.1 定义

- 索引与表行物理顺序一致性
- 0 - num_blocks(最佳)
- 0 - num_rows(最差)

6.2 影响

- CF 接近块数 → 索引高效
- CF 接近行数 → 索引低效
- 影响 CBO 决策

6.3 Jonathan 建议

- 重建表(按索引列排序)
- IOT
- 评估

7. 直方图

7.1 何时使用

- 数据倾斜
- 等值查询
- 范围查询

7.2 类型

- Frequency:≤254 distinct
- Height Balanced:>254
- Top-Frequency:12c+
- Hybrid:12c+

7.3 Jonathan 分析

- 倾斜列必要
- 均匀列不必要
- 监控

8. Bind Peeking

8.1 9i+

- 第一次窥探绑定值
- 决定执行计划
- 后续复用

8.2 问题

- 数据倾斜
- 第一次值影响
- 不稳定

8.3 11g ACS

- Adaptive Cursor Sharing
- 多个执行计划
- 自适应

8.4 Jonathan 观点

- Bind Peeking 双刃剑
- 评估业务
- ACS 改进

9. 10053 事件

9.1 启用

ALTER SESSION SET EVENTS '10053 trace name context forever, level 1';
-- 执行 SQL
ALTER SESSION SET EVENTS '10053 trace name context off';

9.2 trace 内容

- 统计信息
- 成本计算
- 执行计划
- CBO 决策

9.3 Jonathan 推荐

- 诊断 CBO
- 理解决策
- 高级

10. 执行计划稳定性

10.1 SQL Profile

- 自动调优
- 辅助信息
- 11g+

10.2 SQL Plan Baseline

- 11g+
- 捕获历史
- 防止回归

10.3 Jonathan 建议

- Baseline 优先
- 防止突变
- 监控

11. 常见 CBO 问题

11.1 全表扫描

- 索引不存在
- CF 差
- 统计信息陈旧

11.2 错误连接

- 统计信息不准
- HINT
- 评估

11.3 评估不准

- 直方图缺失
- 动态采样
- 收集

12. Jonathan 案例

12.1 案例:评估偏差

- E-Rows 1
- A-Rows 1000000
- 直方图
- 收集

12.2 案例:连接错误

- NL 连接大数据
- Hash Join 优化
- HINT

12.3 案例:CF 问题

- CF 接近行数
- 重建表
- 性能提升

13. Jonathan 著作

- 《Cost-Based Oracle Fundamentals》
- 《Oracle Core: Essential Internals for DBAs》
- 《Oracle Insights》

14. Jonathan 方法论

14.1 思维

- 理解 CBO 原理
- 数据驱动
- 测试验证

14.2 工具

- DBMS_XPLAN
- 10053
- DBMS_STATS
- 测试用例

14.3 步骤

1. 获取执行计划
2. 检查统计信息
3. 对比 E/A Rows
4. 分析 CBO 决策
5. 优化

15. 最佳实践

  1. 统计信息:准确
  2. 直方图:倾斜列
  3. CF:优化
  4. 10053:诊断
  5. Baseline:稳定
  6. E/A 对比:偏差
  7. 测试:验证
  8. 案例:学习
  9. 原理:理解
  10. 持续:学习

16. 参考资料

[1] Jonathan Lewis, https://jonathanlewis.wordpress.com [2] Jonathan Lewis, “Cost-Based Oracle Fundamentals”, Apress [3] Jonathan Lewis, “Oracle Core”, Apress