INSERT 성능 90% 올리기 — FROM TABLE로 일괄 삽입 #shorts #SAP #ABAP
Moderator
이 글이 답하는 질문
- LOOP AT ... INSERT가 왜 느린가?
- INSERT ... FROM TABLE은 어떻게 다른가?
- 실제 코드에서 어떻게 바꾸면 되나?
LOOP AT + INSERT — 뭐가 문제인가
행마다 DB 왕복이 발생한다. 1,000건이면 최소 1,000번 네트워크 라운드트립.
DATA lt_order TYPE TABLE OF zso_header.
" ... lt_order 채우기
LOOP AT lt_order INTO DATA(ls_order).
INSERT zso_header FROM ls_order. " DB 1번씩 1,000회
ENDLOOP.
내부 테이블에 10,000건만 넘어도 시간이 눈에 띄게 늘어난다. Work Process 자원도 Loop 동안 계속 점유된다.
INSERT ... FROM TABLE — 한 줄로 끝내기
내부 테이블 전체를 단일 DB 문으로 보낸다. DB 서버가 일괄 처리하므로 라운드트립은 1회.
DATA lt_order TYPE TABLE OF zso_header.
" ... lt_order 채우기
INSERT zso_header FROM TABLE lt_order.
IF sy-subrc = 0.
COMMIT WORK.
ELSE.
" 중복 키 등 처리
ROLLBACK WORK.
ENDIF.
sy-subrc가 0이면 전체 성공, 4이면 일부 행이 중복 키로 실패(단, 나머지는 삽입될 수 있음 — ACCEPTING DUPLICATE KEYS 옵션 참고).
ACCEPTING DUPLICATE KEYS가 필요한 경우
INSERT zso_header FROM TABLE lt_order
ACCEPTING DUPLICATE KEYS.
" sy-dbcnt: 실제 삽입된 건수
WRITE: / '삽입 건수:', sy-dbcnt.
옵션 없이 중복 키가 있으면 ABAP 런타임 오류(DBIF_RSQL_DUPLICATE_KEY) 발생. 운영 시스템에서는 반드시 핸들링 필요.
삽질 노트
- INSERT FROM TABLE은 DB 커밋을 포함하지 않는다. COMMIT WORK를 따로 호출해야 실제 반영.
- 내부 테이블이 비어 있으면 sy-subrc = 0, sy-dbcnt = 0으로 조용히 성공 처리된다 — 예상과 다른 결과 주의.
- HANA 기반에서도 Bulk Insert는 row-by-row 대비 10배 이상 빠른 경우가 흔하다.
핵심 한 줄
LOOP AT + INSERT는 DB를 N번 치고, INSERT FROM TABLE은 단 1번 친다.
더 파볼 주제
- MODIFY ... FROM TABLE — 존재하면 UPDATE, 없으면 INSERT
- ABAP SQL COMMIT WORK AND WAIT 차이
- SAP HANA Bulk Insert 내부 처리 방식