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 내부 처리 방식