2017-06-14 161 views
0

我有這個plsql腳本。我能夠在大約300行的測試臺上測試它,並且它工作得很好。但是,當我嘗試使用大約1M行的實際表來運行它時,它並未完成。我想就如何優化我的腳本尋求您的建議,我是plsql的新手,所以任何想法/建議都非常有幫助。 :)PLSQL腳本優化/調優

DECLARE 
    c_BGROUP PP_TRANCHE_RBS.BGROUP%TYPE := 'RBS'; 
    l_start  NUMBER; 

    /* Check for all entries where pt03d = pt04d+1. */ 
    CURSOR c_pp_tranche IS 
     SELECT 
      refno, 
      pt04d, 
      seqno 
     FROM PP_TRANCHE_RBS a 
     WHERE a.BGROUP = c_BGROUP 
     AND a.pt03d = (SELECT (pt04d + 1) 
         FROM PP_TRANCHE_RBS 
         WHERE bgroup = a.bgroup 
         AND refno = a.refno 
         and seqno = a.seqno) 
    ; 

    TYPE c_refno IS TABLE OF PP_TRANCHE_RBS.REFNO%TYPE; 
    TYPE c_pt04d IS TABLE OF PP_TRANCHE_RBS.PT04D%TYPE; 
    TYPE c_seqno IS TABLE OF PP_TRANCHE_RBS.SEQNO%TYPE; 

    t_refno c_refno; 
    t_pt04d c_pt04d; 
    t_seqno c_seqno; 

BEGIN 

    DBMS_OUTPUT.put_line('Updating rows... '); 

    l_start := DBMS_UTILITY.get_time; 

    OPEN c_pp_tranche; 
    LOOP 

     FETCH c_pp_tranche BULK COLLECT INTO t_refno, t_pt04d, t_seqno LIMIT 10000; -- break the data into chucks of 10000 rows 
     EXIT WHEN t_refno.COUNT() = 0; -- cursor attribute to exit when 0. 

     FORALL i IN t_refno.FIRST .. t_refno.LAST 

      /* Update pt03d = pt04d */ 
      UPDATE PP_TRANCHE_RBS 
      SET pt03d = t_pt04d(i) 
      WHERE 
       bgroup = c_BGROUP 
       AND refno = t_refno(i) 
       AND seqno = t_seqno(i) 
      ; 

     -- Process contents of collection here. 
     DBMS_OUTPUT.put_line(t_refno.count || ' rows was updated');  

    END LOOP; 

     DBMS_OUTPUT.put_line('Bulk Updates Time: ' || (DBMS_UTILITY.get_time - l_start)); 

    CLOSE c_pp_tranche; 
END; 
/

exit; 
+0

任何錯誤消息?你的DBMS_OUTPUT.put_line()調用的價值是什麼? – tale852150

+0

沒有錯誤信息或任何輸出:( – Shin

+0

沒有爲DBMS_OUTPUT.put_line(t_refno.count ||'rows was updated'); ??設置dbms_output.enable(NULL);在你的代碼開始。運行這個通過SQLPlus也運行* set serveroutput on *之前運行您的代碼 – tale852150

回答

4

的當量純SQL語句:

UPDATE PP_TRANCHE_RBS 
    SET pt03d = pt04d 
    WHERE bgroup = 'RBS' 
    and pt03d = pt04d + 1; 

這可能會跑的比你的程序的版本速度更快。 PL/SQL批量處理比逐行更快,但通常比單個基於集的操作要慢。因此,如果您的複雜轉換邏輯只能在程序上處理,那麼就保存它。

+0

感謝您的支持! – Shin