如何在函数中使用全局临时表?

问题描述 投票:1回答:1

所以我有一个函数,它接受3个IN参数(小时,日期,代码)并返回一个数字。

我的功能代码如下:

create or replace FUNCTION     get_max_value    (rhr       NUMBER,
                                                 rdate    VARCHAR2,
                                                 rcode      VARCHAR2)
   RETURN NUMBER
IS
   rvalue_day   NUMBER;
--
BEGIN
   SELECT MAX (v.value)
     INTO rvalue_day
     FROM table v
          JOIN rel_table_1 sv ON (v.value_id = sv.value_id)
          JOIN look_up_table ff ON (sv.form_field_id = ff.form_field_id)
    WHERE     v.date = rdate
          AND v.code = rcode
          AND v.hr_num = rhr
          AND (v.code = 'PASS' OR v.code IS NULL);
   RETURN rvalue_day;
END;

由于性能问题,我试图使用一个全局临时表来获取值(v.value)和与之关联的primary_identifier(value_Id)。我的代码如下:

with  table_c as 
(
  select value, value_id 
    from table where date = rdate 
     AND code = rcode 
     AND hr_num = rhr
 )
select MAX (v.value)
     FROM table_c v
          JOIN rel_table_1 sv ON (v.value_id = sv.value_id)
          JOIN look_up_table ON (sv.form_field_id = ff.form_field_id)
    WHERE     ff.code_desc = rcode;

有没有办法可以将上述方法合并到一个函数中,以便它可以接受多个参数的值?我目前有一个存储过程尝试通过在这3个参数中插入3个值来获取值...

提前致谢!

sql oracle plsql
1个回答
2
投票

这不是您的问题“如何优化此功能”的答案。 我将告诉你,使用函数的想法可能是你性能问题的原因 - 我猜你的情况就是这种情况。


请看下面非常简单的案例:

create table ttest as 
select * from all_objects
fetch first 10000 rows only;

create index ttest_ix on ttest(object_type);

create or replace function get_max(p_object_type varchar)
return number
is
  ret_val number;
begin
  select max(object_id) into ret_val
  from ttest
  where object_type = p_object_type;
  return ret_val;
end;
/

create or replace view get_max_view as
select object_type, max(object_id) as max_id
from ttest
group by object_type
;

视图get_max_view相当于函数get_max,你可以在查询中使用这两种方式:

select object_id, object_type, get_max(object_type) as max_id
from ttest;

select object_id, object_type, 
       (select max_id from get_max_view x where x.object_type = t.object_type) as max_id
from ttest t;

现在请检查上述两个查询都是针对10000条记录运行的情况 - 为此我将两个查询作为子查询嵌套,并计算所有结果的总和:

set timings on;

select sum(max_id)
from (
    select object_id, object_type, get_max(object_type) as max_id
    from ttest
);

SUM(MAX_ID)
-----------
  214087478

Elapsed: 00:00:11.764

select sum(max_id)
from (
    select object_id, object_type, 
           (select max_id from get_max_view x where x.object_type = t.object_type) as max_id
    from ttest t
);

SUM(MAX_ID)
-----------
  214087478

Elapsed: 00:00:00.011

请检查时间 - 11.76秒对11毫秒。 这快了1000多倍 - 快了100000! 这就是我在评论中建议你用视图替换这个功能的原因,因为这是导致性能问题的最可能原因,并且尝试优化此功能可能是错误的方法。

© www.soinside.com 2019 - 2024. All rights reserved.