Oracle 扩展统计详解

Oracle 扩展统计详解

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

扩展统计捕获列组相关性[1]:

详细见:Oracle 优化器统计信息管理Oracle 直方图与统计信息


2. 问题

2.1 列相关

-- 列相关
SELECT * FROM cars WHERE make = 'Toyota' AND model = 'Camry';
-- Toyota + Camry 强相关
-- 但 CBO 假设独立
-- 估计不准

2.2 影响

- 估计不准
- 执行计划差
- 性能问题

3. 创建

3.1 列组

SELECT DBMS_STATS.CREATE_EXTENDED_STATS('SCOTT', 'EMP', '(job, dept_id)')
FROM dual;

3.2 函数统计

SELECT DBMS_STATS.CREATE_EXTENDED_STATS('SCOTT', 'EMP', '(UPPER(name))')
FROM dual;

3.3 自动

-- 收集时自动
EXEC DBMS_STATS.GATHER_TABLE_STATS(
  'SCOTT', 'EMP',
  method_opt => 'FOR ALL COLUMNS SIZE AUTO'
);

4. 收集

4.1 自动

EXEC DBMS_STATS.GATHER_TABLE_STATS(
  'SCOTT', 'EMP',
  method_opt => 'FOR COLUMNS (job, dept_id) SIZE 254'
);

4.2 直方图

- 列组也可直方图
- SIZE 254
- 数据倾斜

5. 查看

5.1 视图

SELECT extension_name, extension
FROM dba_stat_extensions
WHERE table_name = 'EMP';

SELECT column_name, num_distinct, num_buckets, histogram
FROM dba_tab_col_statistics
WHERE table_name = 'EMP';

5.2 列组名

- SYS_STU...
- 系统命名

6. 删除

EXEC DBMS_STATS.DROP_EXTENDED_STATS('SCOTT', 'EMP', '(job, dept_id)');

7. SQL Plan Directive

7.1 关系

- Directive 建议扩展统计
- 创建扩展统计
- Directive 状态 SUPERSEDED

7.2 自动

- 12c+ 自动
- Directive 提示
- DBMS_STATS 创建

详细见:Oracle SQL Plan Directive 详解


8. 应用场景

8.1 列相关

- 多列条件
- 强相关
- 扩展统计

8.2 函数

- UPPER/LOWER
- 函数索引匹配
- 函数统计

8.3 复杂查询

- 多列组合
- 估计偏差
- 扩展统计

9. 性能影响

9.1 优化器

- 估计准确
- 执行计划好
- 性能提升

9.2 开销

- 收集开销
- 存储
- 监控

10. 监控

10.1 使用

SELECT e.extension, s.num_distinct, s.histogram
FROM dba_stat_extensions e, dba_tab_col_statistics s
WHERE e.table_name = 'EMP'
  AND e.extension_name = s.column_name(+);

10.2 效果

-- 对比执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id'));

11. 常见问题

11.1 不生效

- 未收集
- 直方图
- 检查

11.2 过多

- 监控
- 清理无效

11.3 性能

- 收集慢
- 并行
- 优化

12. 最佳实践

  1. 列相关:扩展
  2. 函数:函数统计
  3. 自动:Directive
  4. 收集:定期
  5. 直方图:倾斜
  6. 监控:使用
  7. 测试:效果
  8. 清理:无用
  9. 文档:记录
  10. 演练:定期

13. 参考资料

[1] Oracle Database SQL Tuning Guide 19c, “Extended Statistics” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/