2016-09-01 7 views
0

テーブルtblmailのレコードの10年前に10億のデータが必要です。 私はバッチサイズでやっています。オラクルで何百万ものデータをパージするベストプラクティス

CREATE OR REPLACE PROCEDURE PURGE_Data AS 
batch_size INTEGER := 1000; 
pvc_procedure_name  CONSTANT VARCHAR2(50) := 'Purge_data'; 
pvc_info_message_num  CONSTANT NUMBER := 1; 
pvc_error_message_type CONSTANT VARCHAR2(5) := 'ERROR'; 
v_message schema_mc.db_msg_log.message%TYPE; 
v_msg_num schema_mc.db_msg_log.msg_num%TYPE; 
/* 
    Purpose: Provide stored procedures to be used to purge unwanted archives. 
*/ 
BEGIN 
Delete from tblmail where createdate_dts < (SYSDATE - INTERVAL '10' YEAR) and ROWNUM <= batch_size; 
COMMIT;  
EXCEPTION 
      WHEN OTHERS THEN 
        ROLLBACK; 
        v_msg_num := SQLCODE; 
        v_message := 'Error deleting from tblmail table'; 
        INSERT INTO error_log 
          (date, num, type, source, mail) 
         VALUES    
          (systimestamp, v_msg_num, pvc_error_message_type,pvc_procedure_name, v_message); 
        COMMIT;  
END; 

一括収集と削除を使用する必要がありますか?これを行う最善の方法は何ですか?

+4

単一の削除操作はバッチ処理よりも高速ですが、データベースが10億レコードの一回限りの削除を許可するように構成されていない可能性があります。何行保管していますか?あなたはこれについてあなたのDBAと話しましたか? –

答えて

0

常にコンピューティングはそれに依存します。 createdate_dtsに索引がある場合、プロシージャーは機能するはずですが、呼び出しを停止する時期をどのように知っていますか?私はループを使用する傾向があります。

loop 
    delete /*+ first_rows */ from tblmail where createdate_dts < 
    (SYSDATE - INTERVAL '10' YEAR) and ROWNUM <= batch_size; 
    v_rows := SQL%ROWCOUNT; 
    commit; 
    exit when v_rows = 0; 
end loop; 

手順の外にループを保持したい場合は、削除したレコードの数を返すこともできます。 createdate_dtsに索引を付けないと、最初に1回のパスで削除する行の主キーを収集してからループして、一括収集などでコミットあたりのバッチ・サイズ・レコードを削除するほうが安いかもしれません。しかし、可能であれば、簡単な解決策を使用することは常にいいです!最適なバッチサイズを見つけるために少し実験したいかもしれません。

関連する問題