我遇到了性能问题,也许您可以帮助解决。当我打开游标时,然后运行其他几个SELECT语句以使用游标中的变量来检索值(请参见下文)。这似乎减慢了整个过程。我认为这是因为PL / SQL和SQL引擎之间的切换。使用表集合会有所帮助吗?但是,正如我所看到的,由于我需要来自不同表的不同列,因此我需要具有多个不同的集合,如何在一条记录中输出所有内容以返回结果集?
CREATE OR REPLACE procedure sp_test (in_input in number)
as
v_calc number;
v_calc_res number;
v1 number;
v2 number;
v3 number;
CURSOR C_test IS
select col1 from test where col1 = in_input;
begin
open c_test
loop
fetch c_test into v_calc;
select col1 into v1 from t1;
select col1 into v2 from t2;
select col1 into v3 from t3;
v_calc_res := v_calc * 5 * v1 * v2 * v3;
dbms_output.put_line(v_calc_res);
end loop;
end sp_test;
/
答案 0 :(得分:5)
逐行通常较慢。
最快的方法-如果可能的话-将跳过循环,并在单个SELECT
语句中完成所有操作,并将所有涉及的表加入该操作中。那可能是一个巨大的查询,所以我建议您逐步进行操作,一个接一个地添加一个表,检查性能,注意执行计划,涉及的索引列以及其他可能有助于提高性能。
答案 1 :(得分:0)
尝试在一个游标查询中使用所有内容。
下面是代码,它只是尝试向您展示考虑您代码的演示。
CREATE OR REPLACE PROCEDURE SP_TEST (
IN_INPUT IN NUMBER
)
as
-- COMMENTED ALL THE VARIABLE EXCEPT NECESSARY ONE
--V_CALC NUMBER;
V_CALC_RES NUMBER;
--V_BLAH_BLAH NUMBER;
--V_BLAH_BLAH_BLAH NUMBER;
--V_BLAH_BLAH_BLAH NUMBER;
CURSOR C_TEST IS
SELECT --T.blah, T1.blah_blah, T2.blah_blah_blah , T3.blah_blah_blah_blah
T.BLAH * 5 * T1.BLAH_BLAH * T2.BLAH_BLAH_BLAH * T3.BLAH_BLAH_BLAH_BLAH -- CALCULATION HERE
FROM
TEST T -- ADDED ALL JOINS HERE
INNER JOIN T_BLAH_BLAH T1 ON (<JOIN CONDITION>)
INNER JOIN t_blah_blah_blah T2 ON (<JOIN CONDITION>)
INNER JOIN t_blah_blah_blah_blah T3 ON (<JOIN CONDITION>)
where T.blah = in_input; -- WHERE CONDITION HERE
BEGIN
OPEN C_TEST
LOOP
FETCH C_TEST INTO V_CALC_RES; --RESULT OF THE CALCULATION DIRECTLY HERE
-- ALL SINGLE STATEMENTS ARE COMMENTED
--select blah_blah into v_blah_blah from t_blah_blah;
--select blah_blah_blah into v_blah_blah_blah from t_blah_blah_blah;
--select blah_blah_blah_blah into v_blah_blah_blah_blah from t_blah_blah_blah_blah;
-- CALCULATION ALREADY DONE IN CURSOR
--v_calc_res := v_calc*5*v_blah_blah*v_blah_blah_blah*v_blah_blah_blah_blah;
DBMS_OUTPUT.PUTLINE(V_CALC_RES);
END LOOP;
END;
/
干杯!