Oracle Bulk Insert 기능은 대용량 데이터 처리를 위한 주요 기술입니다. 일반적인 건별 입력 방식에 비해 대량 데이터를 입력 속도를 크게 개선할 수 있습니다. 이번 글은 파이썬의 Oracle Bulk Insert 사용 방법을 소개합니다.
Oracle Bulk Insert 개념
바인드 변수를 이용하는 아래 INSERT 문장은 데이터 1건을 입력합니다. 만약 10,000건의 데이터를 입력해야 한다면 10,000번의 SQL 실행이 필요합니다.
INSERT INTO TAB1 ( COL1, COL2, COL3 ) VALUES ( :V1, :V2, :V3 );
Bulk Insert 방식은 한번의 SQL 실행으로 여러 건의 데이터를 입력하는 방식입니다. 일반적인 방식과 SQL 문장은 같지만 바인드 변수로 전달되는 값의 차이가 있습니다. 바로 하나의 값이 아닌 배열(Array) 형태의 값을 전달하는 것 입니다.
Bulk 처리를 하면 눈에 띄게 성능이 좋아집니다. 가장 큰 이유는 SQL 실행을 위한 DBMS 호출(Call)이 적어지기 때문입니다. SQL을 실행할 때마다 오버헤드(overhead)가 발생하는데, 대량 데이터를 건별로 처리하면 이 부하가 무시할 수 없는 수준이 됩니다. Bulk 처리는 SQL 호출로 인한 오버헤드 부하를 크게 줄여주는 것이 핵심입니다.
주의할 점은 바인드 변수 배열의 크기를 적절히 조정해야 하는 것입니다. 배열 크기(Array Size)가 커질 수록 호출 부하는 줄어들지만 적정한 수준을 넘어서면 성능이 더 이상 좋아지지 않습니다. 오히려 과도한 메모리 사용으로 시스템 자원을 낭비하는 경우도 있습니다. 배열 크기는 레코드의 길이나 데이터 특성에 따라 조정해야 합니다.
Bulk 처리 구현 방법은 프로그래밍 언어에 따라 약간의 차이가 있지만 작동 방식은 동일합니다.
필요한 라이브러리 설치
먼저 파이썬과 Oracle DB 연동을 위해 oracledb 패키지를 설치합니다.
pip install oracledb
일반적인 입력 방식
먼저 반복문을 이용해 1건씩 입력하는 예제를 보겠습니다. 이 때는 execute 메서드를 사용합니다.
# DB 연결
con = oracledb.connect(user="scott", password="tiger", dsn="localhost:1521/orcl")
cursor = con.cursor()
sqltext = "INSERT INTO TAB1 ( COL1, COL2, COL3 ) VALUES ( :V1, :V2, :V3 )"
# 입력 데이터
datas = []
datas.append( [1, 1, 1] )
datas.append( [2, 2, 2] )
datas.append( [3, 3, 3] )
datas.append( [4, 4, 4] )
datas.append( [5, 5, 5] )
# SQL 실행 반복문
for data in datas:
cursor.execute(sqltext, data)
con.commit()
# DB 연결해제
con.close()
Oracle Bulk Insert 방식
다음은 Oracle Bulk Insert 방식을 이용하는 예제입니다. executemany 매서드를 이용하고 전달하는 파라미터는 중첩 배열 리스트입니다.
# DB 연결
con = oracledb.connect(user="scott", password="tiger", dsn="localhost:1521/orcl")
cursor = con.cursor()
sqltext = "INSERT INTO TAB1 ( COL1, COL2, COL3 ) VALUES ( :V1, :V2, :V3 )"
# 입력 데이터
datas = []
datas.append( [1, 1, 1] )
datas.append( [2, 2, 2] )
datas.append( [3, 3, 3] )
datas.append( [4, 4, 4] )
datas.append( [5, 5, 5] )
# Bulk Insert
cursor.executemany(sqltext, datas)
con.commit()
# DB 연결해제
con.close()