性能问题-集合会提高性能吗?

时间:2019-06-30 20:33:56

标签: oracle performance plsql query-optimization

我遇到了性能问题,也许您可​​以帮助解决。当我打开游标时,然后运行其他几个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;
/

2 个答案:

答案 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;
/

干杯!