他のテーブルから大量にデータをコピーする場合、APPENDヒント句を付与することにより、
バッファ・キャッシュ(SGA)を経由せずにINSERT処理を行うこと。
使用上の注意
・表単位のロックが発生する
・INSERT後にコミットが必要(コミットする前にそのテーブルに対してSELECTなど行うとエラーになる)
・ブロックの使用効率が悪い(空きブロックではなく、ブロックを追加してそこにインサートするため)
上記の理由よりアプリ内に組み込むのは有効ではないケースが多いので、データの移行などで使用するとよい。
使用例
SET SERVEROUTPUT ON; BEGIN --開始時間の出力 DBMS_OUTPUT.PUT_LINE('START = ' || TO_CHAR(SYSTIMESTAMP,'yyyymmddhh24missff3')); --INSERTの実行 INSERT /*+ APPEND */ INTO WK_TBL_B ( USERID , REC_ENT_YMD , REC_EDT_PG , REC_EDT_USER , REC_EDT_TERM ) SELECT USERID , SYSDATE , 'PG' , 'USER' , 'TERM' FROM WK_TBL_A; --終了時間の出力 DBMS_OUTPUT.PUT_LINE('END = ' || TO_CHAR(SYSTIMESTAMP,'yyyymmddhh24missff3')); END; /
試してみた結果、1万件のデータの処理時間が3.5秒から2.5秒に短縮された。(もちろん環境によって左右されるが。。。)