oracle hash leading,oracle 使用leading, use_nl, rownum调优(引用)

成本计算方法:

设小表100行,大表100000行。

两表均有索引:

如果小表在内,大表在外(驱动表)的话,则扫描次数为:

100000+100000*2 (其中2表示IO次数,一次索引,一次数据)

如果大表在内,小表在外(驱动表)的话,则扫描次数为:

100+100*2.

两表均无索引:

如果小表在内,大表在外的话,则扫描次数为:

100000+100*100000

如果大表在内,小表在外的话,则扫描次数为:

100+100000*100

注意:如果一个表有索引,一个表没有索引,ORACLE会将没有索引的表作驱动表。如果两个表都有索引,则外表作驱动表。如果两个都没索引的话,则也是外表作驱动表。

2、使用index直接匹配索引来查询数据提高查询速度

/*+INDEX(TABLE INDEX_NAME)*/

表明对表选择索引的扫描方法.

3、当判断某几个表中是否存在某种关系的行时可使用rownum=1来作为条件而加快速度,如果必须有多行才满足条件时,可设置rownum <= n。

例如:获得一个v_count值判断是否大于0

equipment表 几万条,controledpnsnrange 几千条

select

count(sc.pmnum)

into

v_count

from

equipment e,

sal_controledpnsnrange sc

where

(sc.new_min_item_no <= e.itemnum)

and (sc.new_max_item_no >= e.itemnum)

and (sc.new_min_serial_no <= e.serialnum)

and (sc.new_max_serial_no >= e.serialnum)

and e.itemnum = a_item_no;

执行时间大约为3分钟。

代码修改后:

select /*+ leading(e) use_nl(sc) */

count(sc.pmnum)

into

v_count

from

equipment e,

sal_controledpnsnrange sc

where

(sc.new_min_item_no <= e.itemnum)

and (sc.new_max_item_no >= e.itemnum)

and (sc.new_min_serial_no <= e.serialnum)

and (sc.new_max_serial_no >= e.serialnum)

and e.itemnum = a_item_no;

执行时间大约为45秒。

代码再次修改后:

select /*+ leading(e) use_nl(sc) */

count(sc.pmnum)

into

v_count

from

equipment e,

sal_controledpnsnrange sc

where

(sc.new_min_item_no <= e.itemnum)

and (sc.new_max_item_no >= e.itemnum)

and (sc.new_min_serial_no <= e.serialnum)

and (sc.new_max_serial_no >= e.serialnum)

and e.itemnum = a_item_no

and rownum = 1;

执行时间大约为4秒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值