ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 使用rownum减少函数调用

使用rownum减少函数调用

原创 Linux操作系统 作者:lfree 时间:2007-03-30 00:00:00 0 删除 编辑
摘自:oracle高效设计:

1。建立测试表:
create table t1
( prc_chk_key number(9) not null,
prod_key number(12) not null,
cmpt_loc_key number(5) not null,
loc_key number(5) not null,
prc_chk_dt date
)
/

insert into t1 select 2, 3, 4, 5, sysdate
from all_objects where ROWNUM <= 50;


create table t2
( prc_chk_key number(9) not null,
prc_chk_typ_desc varchar2(35) not null,
cmpt_loc_key number(5),
loc_key number(5) not null
)
/


insert into t2 select 2, 'x', 4, 5
from all_objects where ROWNUM <= 50;


CREATE OR REPLACE function F
(v_prod_key IN number default NULL,
v_prc_chk_key IN number default NULL,
v_return IN varchar2 default NULL,
v_want_sr IN varchar2 default NULL,
v_version IN number ) RETURN varchar2
as
begin
dbms_application_info.set_client_info
(userenv('client_info')+1);
return 'x';
end;
/


2。执行如下sql:
exec dbms_application_info.set_client_info(0);

select /*+ use_hash( a11, a12 ) */
a12.prc_chk_typ_desc prc_chk_typ_desc,
a11.prc_chk_dt prc_chk_dt,
a11.cmpt_loc_key cmpt_loc_key,
a11.prod_key upc_prod_key,
a11.loc_key loc_key,
max(F(a11.PROD_KEY,a11.PRC_CHK_KEY, 'QTY', 'D', 1) ),
max(F(a11.PROD_KEY, a11.PRC_CHK_KEY, 'AMT', 'D',1) ),
max(F(a11.PROD_KEY, a11.PRC_CHK_KEY,'CODE','D', 1) ),
max(F(a11.PROD_KEY, a11.PRC_CHK_KEY, 'PRC', 'D',1) )
from t1 a11,
t2 a12
where a11.cmpt_loc_key = a12.cmpt_loc_key
and a11.loc_key = a12.loc_key
and a11.prc_chk_key = a12.prc_chk_key
group by a12.prc_chk_typ_desc, a11.prc_chk_dt,
a11.cmpt_loc_key, a11.prod_key, a11.loc_key;


set autotrace off
select userenv('client_info' ) data from dual;

结果10000,

3。如果修改如下:
exec dbms_application_info.set_client_info(0);

select /*+ USE_HASH( a11, a12 ) */
a12.prc_chk_typ_desc prc_chk_typ_desc,
a11.prc_chk_dt prc_chk_dt,
a11.cmpt_loc_key cmpt_loc_key,
a11.prod_key upc_prod_key,
a11.loc_key loc_key,
max(a),
max(b),
max(c),
max(d)
from (select a11.*,
F(a11.PROD_KEY, a11.PRC_CHK_KEY, 'QTY', 'D', 1 ) a,
F(a11.PROD_KEY, a11.PRC_CHK_KEY, 'AMT', 'D',1 ) b,
F(a11.PROD_KEY, a11.PRC_CHK_KEY, 'CODE', 'D', 1 ) c,
F(a11.PROD_KEY, a11.PRC_CHK_KEY, 'PRC', 'D',1 ) d,
ROWNUM r
from t1 a11 ) a11,
T2 a12
where a11.cmpt_loc_key = a12.cmpt_loc_key
and a11.loc_key = a12.loc_key
and a11.prc_chk_key = a12.prc_chk_key
group by a12.prc_chk_typ_desc, a11.prc_chk_dt,
a11.cmpt_loc_key, a11.prod_key, a11.loc_key;

select userenv('client_info' ) data from dual;

这样结果200,可以减少函数的调用。这个例子通过加入一列rownum伪列,并没有成指数增长。包含rownum的内嵌试图将被求值并且实体化,这样减少了函数的调用。如果去掉rownum,或者加入一个1 r 这样,并不能达到这个目的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-83002/,如需转载,请注明出处,否则将追究法律责任。

上一篇: vim该如何做
请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    3399
  • 访问量
    7101237