天天看點

使用PL/SQL删除百萬條記錄的大表

使用PL/SQL删除百萬條記錄的大表:

最近開發人員對測試環境資料庫進行了壓力測試,資料庫中産生了大量的髒資料。有幾張大表裡資料量均在百萬甚至千萬條的記錄數。開發人員現提出需求如下:

隻清理其中的部分髒資料,不允許對這些表使用truncate操作。于是就有了下面的PL/SQL清理腳本:

1.編寫删除資料表資料的腳本内容如下:

$ cat data_del.sql 

set serveroutput on

show serveroutput

DECLARE 

V_LOGNUM NUMBER;

V_NEEDARC NUMBER;

BEGIN 

SELECT count(1) INTO V_LOGNUM FROM V$LOG; 

LOOP 

SELECT count(1) INTO V_NEEDARC FROM V$ARCHIVE; 

IF V_NEEDARC < V_LOGNUM - 1 THEN 

 EXIT; 

ELSE 

 DBMS_LOCK.SLEEP(60); 

END IF; 

END LOOP; 

DELETE FROM T_USER.T_TABLE_NAME WHERE mobile='13800138000' AND rownum < 100; 

IF SQL%ROWCOUNT = 0 THEN 

 COMMIT; 

END;

/

2.編寫調用腳本:

$vim clear_dirt_data.sh

source ~/.bash_profile

@data_del.sql;

exit;

EOF

此腳本程式,通過利用dbms_output.sleep()過程,在删除過程中當需要歸檔的日志檔案達到認定的限制時,使删除過程暫時停止,等待ARCH程序将日志檔案歸檔後再繼續進行,進而達到避免歸檔日志檔案來不及歸檔,導緻資料庫挂起的問題。 此方法适用于oracle的各個版本。

     本文轉自vcdog 51CTO部落格,原文連結:http://blog.51cto.com/255361/846956,如需轉載請自行聯系原作者