1) 优化器(optimizer)
a) RBO(rule-based optimizer)方式:基于规划的优化方式
所遵循的是oracle内部预定的一些规则.
b) CBO(cost-based optimizer)方式:看语句的执行代价(cost),这里的代价主要指cpu和内存。
优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。
2) 优化模式
a) rule:基于规则的方式
b) choose:默认使用方式,有统计信息,采用CBO,无统计信息,采用RBO.
c) first rows:有统计信息,以最快的时间返回最先几行,通常为NL连接方式。
d) all rows:即cost方式,有统计信息,以最快的方式返回表的所有行,无统计信息,才用RBO;
e) 更新统计信息
表: analyze table table_name compute statistics索引:analyze index index_name estimate statistics
f) 有时候明明有索引但是执行计划没有走索引,原因有二,第一:表或索引的统计信息缺失或过时;第二:表太小,oracle认为不值得走索引。
3) 执行计划管理
优化器会维护所有执行次数超过一次的sql语句的每个执行计划的历史列表(plan history),优化器通过维护一个语句执行的日志条目(statement log)来识别该sql是否为第二次执行。如果为第二次执行,则优化器将语句生成的所有执行计划都插入到plan history表中,只有当新的执行计划的成本比plan baseline 执行计划基准线中的成本低时才使用。
4) sql plus中开启执行计划
a) SET AUTOTRACE ON
–包含执行计划、统计信息、以及脚本结果数据输出
b) SET AUTOTRACE ON EXPLAIN
–包含执行计划、脚本结果数据输出,没有统计信息
c) SET AUTOTRACE TRACEONLY
–有执行计划、统计信息,不会有脚本结果数据输出
d) SET AUTOTRACE OFF
–不生成AUTOTRACE报告,这是缺省模式
e) 注意:PL/SQL Dev工具的Command window中不支持set autotrance on的命令。在PL/SQL中可以按F5来查看。
5) 示例
a) set autotrace traceonly
b) 统计信息:
c) 动态分析
Note-------------dynamic sampling used for the statement
这提示用户CBO当前使用的技术, 当出现这个提示,说明当前表使用了动态采样。说明这个表可能没有分析统计信息。