Oracle 在执行SQL语句时,有两种优化方法:即基于规则的RBO和基于代价的CBO。 在SQL执教的时候,到底采用何种优化方法,就由Oracle参数 optimizer_mode 来决定。
Rule Based Optimizer(RBO)基于规则
Cost Based Optimizer(CBO)基于成本,或者讲统计信息
SQL> show parameter optimizer_mode;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
optimizer_mode stringALL_ROWS
oracle10g开始默认是all_rows
ALL_ROWS不管是不是有统计信息,全部采用基于成本的优化方法,返回最大数的量数据
FIRST_ROWS_n不管是不是有统计信息,全部采用基于成本的优化方法并以最快的速度,返回前N行记录
FIRST_ROWS使用成本和试探法相结合的方法,查找一种可以最快返回前面少数行的方法
第一个是返回所有行的最小代价,第二个是返回前N行的最小代价,最后一个是返回前面的少量行的最好计划
修改全局
alter system set optimizer_mode=all_rows;
修改当前session
alter session set optimizer_mode=all_rows;