Oracle 优化器详解
Oracle 优化器是数据库引擎的核心组件,负责确定执行SQL语句的最高效方式。它的主要任务是为每个SQL语句选择最优的执行计划。
优化器类型
Oracle 提供两种主要的优化器:
-
基于规则的优化器(RBO - Rule-Based Optimizer)
- 遵循一组预定义的规则
- 不考虑数据分布统计信息
- 在Oracle 10g后逐渐被弃用
-
基于成本的优化器(CBO - Cost-Based Optimizer)
- 考虑表、索引的统计信息
- 计算不同执行计划的成本
- 选择成本最低的执行计划
- 现代Oracle版本默认使用CBO
优化器组件
1. 查询转换器(Query Transformer)
- 重写SQL查询以提高效率
- 执行视图合并、子查询展开等操作
- 例如将OR条件转换为UNION ALL
2. 估算器(Estimator)
- 计算三个关键指标:
- 选择性(Selectivity):满足条件的行比例
- 基数(Cardinality):操作返回的行数估计
- 成本(Cost):执行计划的相对资源消耗
3. 计划生成器(Plan Generator)
- 探索不同的执行计划
- 使用动态规划等算法避免穷举所有可能
- 选择成本最低的执行计划
优化器模式
Oracle 优化器可以在不同模式下工作:
-
ALL_ROWS (默认)
- 优化整体查询吞吐量
- 适合批处理操作
-
FIRST_ROWS(n)
- 优化快速返回前n行
- 适合交互式应用
-
FIRST_ROWS
- 类似FIRST_ROWS(n),但n由优化器决定
统计信息
CBO依赖统计信息做出正确决策:
- 表统计:行数、块数、行长度等
- 列统计:不同值数量(NDV)、空值数量、数据分布(直方图)
- 索引统计:层级、聚簇因子等
- 系统统计:I/O和CPU性能
统计信息通过ANALYZE命令或DBMS_STATS包收集:
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCHEMA', 'TABLE');
执行计划
理解执行计划是优化的关键:
-
EXPLAIN PLAN:预测执行计划
EXPLAIN PLAN FOR SELECT * FROM employees WHERE department_id = 10; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); -
DBMS_XPLAN:格式化显示执行计划
-
AUTOTRACE:SQL*Plus中查看实际执行计划
优化器提示(Hints)
可以指导优化器选择特定执行计划:
SELECT /*+ INDEX(employees emp_dept_idx) */ *
FROM employees
WHERE department_id = 10;
常用提示:
/*+ FULL(table) */:强制全表扫描/*+ INDEX(table index) */:强制使用索引/*+ LEADING(table) */:指定连接顺序/*+ USE_NL(table) */:指定嵌套循环连接
常见优化技术
-
索引优化:
- 创建适当的索引
- 避免索引失效场景(如函数应用在索引列)
-
SQL重写:
- 避免SELECT *
- 使用绑定变量减少硬解析
- 简化复杂查询
-
分区策略:
- 对大表进行分区提高查询效率
-
物化视图:
- 预计算和存储聚合结果
监控与诊断
- AWR/ADDM报告:识别性能瓶颈
- SQL Trace/TKPROF:分析SQL执行细节
- V$SQL_PLAN:查看实际执行计划
- SQL Tuning Advisor:自动优化建议
最佳实践
- 定期收集统计信息
- 避免过度使用提示(可能导致计划不稳定)
- 使用绑定变量减少硬解析
- 监控长时间运行的SQL
- 测试环境验证优化效果
Oracle优化器是一个复杂而强大的组件,理解其工作原理对于数据库性能调优至关重要。
1031

被折叠的 条评论
为什么被折叠?



