ダイレクトロードインサート


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