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. 最佳实践
- 列相关:扩展
- 函数:函数统计
- 自动:Directive
- 收集:定期
- 直方图:倾斜
- 监控:使用
- 测试:效果
- 清理:无用
- 文档:记录
- 演练:定期
13. 参考资料
[1] Oracle Database SQL Tuning Guide 19c, “Extended Statistics” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/