优化器模式optimizer
optimizer_mode
oracle
的
optimizer_mode
参数说明:
Syntax
OPTIMIZER_MODE =
{ first_rows_[1 | 10 | 100 | 1000] | first_rows | all_rows }
Default value
all_rows
在
oracle
中,
sql
语句优化分成
RBO
(
Rule-Based Optimization
)基于规则的优化和
CBO
(
Cost-Based Optimization
)基于
代价的优化。
在较早的
oracle
的版本中,
oracle
是采取基于规则的优化,根据
oracle
指定的规则优先顺序,对于指定的表进?执?计划的
选择。?如在规则中,索引的优先级?于全表扫描,那在查询某张拥有所有的表的时候,那就?定是使?索引。
在后来,
oracle
发现这样的做法并不科学,
规则是死的,数据是活的
,并不是说在所有的情况下使?规则都是可?的。于是
oracle
开始推出了
基于代价的优化,收集对象的统计信息并分析得出最优的执?计划
。从
oracle9i
开始,
oracle
就强烈建议使
?
CBO
,这点从
oracle10g
和
oracle11g
的?档中关于优化参数
optimizer_mode
完全不提与
RBO
有关的?个选项就可以看出。
(有?说
CBO
考虑的代价主要是
cpu
和内存,这点不太赞同,在
sql
执?中,我们最需要考虑的?定是和
io
有关的部分,所以
考
虑的?向应该是逻辑读
。在下?的?个测试例?中可以看出
RBO
和
CBO
的?些区别)
optimizer_mode
决定了
oracle
使?
RBO
还是
CBO
,可选值如下:
Choose:
这是
RBO
和
CBO“
中间
”
的?种模式,具体是这样:
1.
当所包含的所有对象有统计信息时,那就是?
CBO
的优化?式。
2.
当所包含的部分对象有统计信息时,也使?
CBO
的?式,并且对剩下的对象的统计信息进?
“
猜测
”
。
3.
如果包含所有对象都没有统计信息时,使?
RBO
的?式。
这个参数在
oracle9i
中是默认值,但是从
oracle10g
版本,默认值变为
ALL_ROWS
,并且?档中完全不提到这个参数(还有另
?个参数是
RULE
)也就是说
oracle
倾向于完全不?
RBO
(
Hint
在之后的?章中讨论)。
RULE
:
oracle
采?
RBO
的?式?作。
ALL_ROWS
:
oracle
采取
CBO
的?式?作,并且计算代价是获取所有?数的代价,也就是如何消耗最少的资源完成整个查
询。
FISRT_ROWS_n
(
n
可以取值的有
1
,
10
,
100
,
1000
):
oracle
采取
CBO
的?式?作,计算代价是获取前
n
?的代价,也就
是如何消耗最少的资源完成前
n
?的查询。
oracle
想的很周到,如果有
top n
的需求,那?这个参数来设置是最好不过的了。
FISRT_ROWS
:
和上?的参数相同,只是为了向后兼容。
那我们来做个简单的实验看看?个参数有什么不同。(为了测试?便,我们使?
pl/sql developer
来调整
sql
的优化模式):
实验表,
twovaluetab
字段
id number
类型
运?脚本?成数据:
declare
cnt number := 0;
begin
execute immediate 'truncate table twovaluetab';
for cnt in 0..20000 loop
insert into twovaluetab values(1);
end loop;