oracle有查询优化器吗,Oracle 配置查询优化器

三. 参数说明

根据参数的功能分为两组:查询优化器参数-只对查询优化器的操作起作用,pga参数-影响程序全局区(PGA)的内存布局。

查询优化器参数

1. optimizer_mode

查询优化器是为了找一个最高效的执行计划,这个参数用来定义什么是“高效”,比如是更快还是占用资源更少。在Oracle10g中只支持两个参数值:

all_rows:提供全部数据

first_rows(n):n为大于0的自然数,表示尽快传输前面n条数据(比如分页查询的时候,我第一次只查询前面10条数据)

oracle10g默认为all_rows,可以再数据库级别,会话级别,或者执行SQL的时候修改该参数的值。

数据库级别:alter system set optimizer_mode=first_rows(10) scope=spfile;

会话级别:ALTER SESSION SET OPTIMIZER_MODE=first_rows(10);

SQL级别:SELECT /*+ first_rows(10) */ id,name from t1 order by id;

其实,默认all_rows是最好的方式,如果确实是只要查询小部分数据,可以在sql级别加上提示,看是否能提高性能。

2. db_file_multiblock_read_count

在多块读的情况下(比如全表扫描),该参数说明一次最多可读取的数据块数目。设置得太小的话,效率低。设置得太高也不见得就好(太高,会受I/O最大吞吐量限制。比如设置成一次最多读取1024块,但I/O最大吞吐量只允许32块,那一次最多也只读取32块。而且一次读取很多块,开销会偏高。)应该通过测试,才能知道应该把该参数设置成哪一个值。

测试过程:

1. 创建一张大表,比如上千万行级别的数据

2. 循环设置该参数的值,查看全表扫描的速度。类似于以下语句:

declare

l_count pls_integer;

l_time pls_integer;

l_starting_time pls_integer;

l_ending_time pls_integer;

begin

dbms_output.put_line('dbfmbrc seconds');

for l_dbfmbrc in 1..32

loop

execute immediate 'alter session set db_file_multiblock_read_count='||l_dbfmbrc;

l_starting_time := dbms_utility.get_time();

select /*+ full(t) */ count(*) into l_count from big_table t;

l_ending_time := dbms_utility.get_time();

l_time := round((l_ending_time-l_starting_time)/100);

dbms_output.put_line(l_dbfmbrc||'  '||l_time);

end loop;

end;

  /0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值