ダイレクトロードインサート
他のテーブルから大量にデータをコピーする場合、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秒に短縮された。(もちろん環境によって左右されるが。。。)