所以我有一个函数,它接受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个值来获取值...
提前致谢!
这不是您的问题“如何优化此功能”的答案。 我将告诉你,使用函数的想法可能是你性能问题的原因 - 我猜你的情况就是这种情况。
请看下面非常简单的案例:
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! 这就是我在评论中建议你用视图替换这个功能的原因,因为这是导致性能问题的最可能原因,并且尝试优化此功能可能是错误的方法。