第三次優化拆分 DELETE 操作 首先,我嘗試從臨時表 temp_mid_hubei 中取出一行記錄: SQL" name="description" />

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 如何給Large Delete操作提速近千倍?(四)

    發表于:2007-05-25來源:作者:點擊數: 標簽:Large千倍delete提速操作
    本文已經發表在ITPUB優化技術叢書,未經許可,不得轉載。 本文已經發表在ITPUB優化技術叢書,未經許可,不得轉載。 1.1. MI LY: 黑體; mso-ascii-font-family: Arial">第三次優化拆分 DELETE 操作 首先,我嘗試從臨時表 temp_mid_hubei 中取出一行記錄: SQL

     本文已經發表在ITPUB優化技術叢書,未經許可,不得轉載。

     本文已經發表在ITPUB優化技術叢書,未經許可,不得轉載。

    1.1. MILY: 黑體; mso-ascii-font-family: Arial">第三次優化——拆分DELETE操作

    首先,我嘗試從臨時表 temp_mid_hubei 中取出一行記錄:

    SQL> select mid ,rowid from  temp_mid_hubei where rownum=1;

     

     

    MID            ROWID

    -------------- ------------------

    00046000019808 AAAngMAGkAAA5SkAAA

     

     

    Elapsed: 00:00:00.01

    SQL>

     

     

     

     

    然后,再根據條件在SSF表中刪除相應的記錄,看看需要多長時間:

    SQL> DELETE from SSF WHERE mid='00046000019808';

     

     

    1 rows deleted.                 

     

     

    Elapsed: 00:00:00.01

    SQL>

     

     

     

     

    請注意,這樣的操作執行幾乎瞬間就可以完成,于是開始拆分DELETE的思路就應運而生:

    1)        首先取出臨時表中的一行(包括ROWID

    2)        根據關鍵字在大表SSF中刪除一行數據(使用唯一索引)

    3)        根據最初記錄的ROWID將這條記錄從臨時表中刪除(以避免重復比較)

     

     

    我修改了存儲過程,如下:

    CREATE OR REPLACE PROCEDURE DEL_HUBEI_SSF

    AS

       v_i     NUMBER (10);

       v_mid   VARCHAR2 (30) := '';

       v_row   ROWID;

    BEGIN

    -- v_i:=10000;

       SELECT COUNT (*)

         INTO v_i

         FROM temp_mid_hubei_bak;

     

     

       WHILE v_i > 0

       LOOP

          SELECT mid, ROWID

            INTO v_mid, v_row

            FROM temp_mid_hubei_bak

           WHERE ROWNUM = 1;

     

     

          DELETE FROM SSF

                WHERE mid = v_mid;

     

     

          DELETE FROM temp_mid_hubei_bak

                WHERE ROWID = v_row;

     

     

          COMMIT;

          v_i := v_i - 1;

       END LOOP;

     

     

       DBMS_OUTPUT.put_line ('Full Finished!!!');

       DBMS_OUTPUT.put_line (   'Totally '

                             || TO_CHAR (v_i)

                             || ' records deleted from hubei_SSF !!!'

                            );

    END;

          

           當然,實際操作的時候,由于這次任務中有幾類的操作都需要用到臨時表temp_mid_hubei,因此,在操作之前需要使用CTAScreate table … as select … )將該表做個備份。

        經過測試,使用這種方法刪除10000條數據,需要大概1分鐘時間,于是準備啟用這個方法來完成任務。

        可是這樣的操作也遠遠不能滿足要求,因為刪除10萬行記錄,并不意味著需要10*1分鐘=10分鐘,而是需要大約30多分鐘??!

        看來,上一個方法的問題(大量操作的時間會成倍增長于少量操作的時間)再一次體現出來,于是,想到了第四次優化——使用FORALL 處理批量作業。

     

     

     

     


    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>