oracle 大表缓存,关于ORACLE表缓存化的一些困惑 请教高手

个人见解,这是一个明显的小表和大表的连接问题,只要索引建立得当并且统计信息也已经收集,那么这时ORACLE应该会使用nested loops进行连接查询,性能应该不差

SQL> create table bigtab(id number,name varchar2(32));

Table created.

SQL> create table smalltab(id number);

Table created.

--insert data to bigtab

declare

cnt number;

begin

for i in 1..1000000 loop

insert into bigtab values(i,sys_guid());

cnt := cnt + 1;

if mod(cnt,10000) = 0 and cnt >= 10000 then

commit;

end if;

end loop;

commit;

end;

/

SQL> select count(*) from bigtab;

COUNT(*)

----------

1000000

--insert data to smalltab

declare

n number := 0;

begin

for i in 1..200 loop

while (n=0) loop

n := floor(dbms_random.value*1000000);

end loop;

insert into smalltab values(n);

end loop;

commit;

end;

/

SQL> select count(*) from smalltab;

COUNT(*)

----------

200

SQL> create index idx_bigtab_id on bigtab(id);

Index created.

SQL> exec dbms_stats.gather_index_stats('SCOTT','IDX_BIGTAB_ID');

PL/SQL procedure successfully completed.

SQL> create index idx_smaltab_id on smalltab(id);

Index created.

SQL> exec dbms_stats.gather_index_stats('SCOTT','IDX_SMALTAB_ID');

PL/SQL procedure successfully completed.

explain plan for select t1.name from bigtab t1,smalltab t2 where t1.id = t2.id;

select * from table(dbms_xplan.display());

sen hash value: 3332719998

----------------------------------------------------------------------------------------------

| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT            |                |   200 |  8800 |   402   (0)| 00:00:05 |

|   1 |  TABLE ACCESS BY INDEX ROWID| BIGTAB         |     1 |    31 |     3   (0)| 00:00:01 |

|   2 |   NESTED LOOPS              |                |   200 |  8800 |   402   (0)| 00:00:05 |

|   3 |    INDEX FULL SCAN          | IDX_SMALTAB_ID |   200 |  2600 |     1   (0)| 00:00:01 |

|*  4 |    INDEX RANGE SCAN         | IDX_BIGTAB_ID  |     1 |       |     2   (0)| 00:00:01 |

----------------------------------------------------------------------------------------------

lect * from table(dbms_xplan.display());

个人认为只有非常频繁的查询一张表并且表比较小时才需要把表keep到buffer_pool中,如在一个循环内部查询一张字典表,这时把这张字典表keep到内存后可以有效降低physical read,但是logical read还是避免不了的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值