PL / SQL块需要花费大量时间来执行

时间:2014-04-04 06:36:23

标签: sql plsql

我正在学习PL / SQL,并编写了一个我在下面粘贴的PL / SQL块。 该块按预期运行,但是需要花费大量时间才能完成该过程。 要检查我在两个表中运行10条记录,需要4分钟。 之后,我试图在大量数据上运行它,即使在5小时后也没有完成。 任何人都可以指导我这里的问题是什么,以及我如何提高性能。下面是我的PL / SQL块。

编辑:在client_trans_vk1中的client_id上没有为更新查询创建索引。这是罪魁祸首。

DECLARE
v_client_id test_vk.client_id%TYPE;
v_trans_amount account_bal.Bal_Am%TYPE;

cursor c_client
is select client_id,TRANS_AM as transaction_amount  from test_vk;

begin
  OPEN  c_client;
  LOOP
    FETCH c_client INTO v_client_id,v_trans_amount;
    BEGIN
    EXIT WHEN c_client%NOTFOUND;
     update client_trans_vk1 ca
       set ca.bal_amt = 0, ca.additional_AM = (ca.additional_AM + v_trans_amount) 
       where ca.client_id = v_client_id;
     commit;
    END;
  end LOOP;
  CLOSE c_client
end;

1 个答案:

答案 0 :(得分:1)

LOOP声明没有退出,我甚至惊讶它甚至工作,它基本上循环了 无限地在最后一排。在您从光标中获取所有行之后,您需要退出循环,如下所示:

DECLARE
v_client_id test_vk.client_id%TYPE;
v_trans_amount account_bal.Bal_Am%TYPE;

cursor c_client
is select client_id,TRANS_AM as transaction_amount  from test_vk;

begin
  OPEN  c_client;
  LOOP
    FETCH c_client INTO v_client_id,v_trans_amount;
    EXIT WHEN c_client%NOTFOUND;
    BEGIN
     update client_trans_vk1 ca
       set ca.bal_amt = 0, ca.additional_AM = (ca.additional_AM + v_trans_amount) 
       where ca.client_id = v_client_id;
     commit;
    END;
  end LOOP;
  CLOSE c_client
end;