Bulk Insert

2025. 2. 15. 09:44IT/Oracle

반응형

Bulk Insert는 대량 데이터를 효율적으로 삽입할 때 사용하는 방법으로, 데이터베이스 종류에 따라 다양한 방식으로 구현할 수 있습니다.
아래는 주요 데이터베이스별로 예제를 정리했습니다.
1. MySQL: LOAD DATA INFILE
 - MySQL에서는 LOAD DATA INFILE 명령을 사용해 대량 데이터를 빠르게 삽입할 수 있습니다.
 - 예제

LOAD DATA INFILE '/path/to/your/data.csv'
INTO TABLE your_table
FIELDS TERMINATED BY ',' -- 컬럼 구분자
ENCLOSED BY '"'          -- 문자 데이터 구분자
LINES TERMINATED BY '\n' -- 행 구분자
IGNORE 1 ROWS;           -- 첫 번째 행(헤더) 무시

 - 사전 조건
• 데이터 파일이 MySQL 서버에 접근 가능한 위치에 있어야 합니다.
• 서버의 secure_file_priv 설정을 확인하세요.

2. SQL Server: BULK INSERT
 - SQL Server에서는 BULK INSERT를 사용해 대량 데이터를 삽입할 수 있습니다.
 - 예제 

BULK INSERT your_table
FROM 'C:\path\to\your\data.csv'
WITH (
    FIELDTERMINATOR = ',', -- 컬럼 구분자
    ROWTERMINATOR = '\n',  -- 행 구분자
    FIRSTROW = 2           -- 첫 번째 행(헤더) 무시
);

 - 대안 : OPENROWSET를 사용해 비슷한 작업을 수행할 수도 있습니다.

3. PostgreSQL: COPY 명령어
 - PostgreSQL에서는 COPY 명령어를 사용해 데이터를 빠르게 삽입할 수 있습니다.
 - 예제

COPY your_table (column1, column2, column3)
FROM '/path/to/your/data.csv'
DELIMITER ',' -- 컬럼 구분자
CSV HEADER;   -- 첫 번째 행(헤더) 무시

 - 주의
• 파일이 서버가 접근할 수 있는 디렉토리에 있어야 합니다.
• 클라이언트에서 직접 파일을 업로드하려면 \COPY를 사용하세요.

4. Oracle: SQL*Loader 또는 INSERT ALL
 - Oracle에서는 SQL*Loader를 사용하는 것이 일반적이며, PL/SQL에서 INSERT ALL을 활용할 수도 있습니다.
 -  SQL*Loader 제어 파일:

LOAD DATA
INFILE '/path/to/your/data.csv'
INTO TABLE your_table
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
    column1,
    column2,
    column3
)


 -  PL/SQL INSERT ALL 예제

INSERT ALL
    INTO your_table (column1, column2) VALUES ('value1', 'value2')
    INTO your_table (column1, column2) VALUES ('value3', 'value4')
SELECT * FROM dual;


5. SQLite: 트랜잭션과 여러 INSERT
 -  SQLite에서는 별도의 BULK INSERT 명령이 없으므로 트랜잭션과 다중 INSERT문을 결합해 성능을 높일 수 있습니다.
 -  예제

BEGIN TRANSACTION;
INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2');
INSERT INTO your_table (column1, column2) VALUES ('value3', 'value4');
-- 많은 INSERT 문...
COMMIT;


6. Python + Pandas 사용한 Bulk Insert
 -  Python에서 pandas 라이브러리와 데이터베이스 커넥터를 활용하여 대량 데이터를 삽입할 수 있습니다.
 -  예제

import pandas as pd
from sqlalchemy import create_engine

# 데이터 읽기
df = pd.read_csv('data.csv')

# 데이터베이스 연결
engine = create_engine('mysql+pymysql://user:password@localhost/db_name')

# Bulk Insert
df.to_sql('your_table', engine, if_exists='append', index=False, chunksize=1000)


7. 배치 처리로 Bulk Insert
 -  대량 데이터를 한 번에 삽입하지 않고 작은 청크로 나눠 처리하면 성능과 안정성이 개선됩니다.
 -  SQL 예제

-- 1000개씩 배치로 삽입
INSERT INTO your_table (column1, column2)
SELECT column1, column2
FROM source_table
WHERE condition
LIMIT 1000 OFFSET 0;

INSERT INTO your_table (column1, column2)
SELECT column1, column2
FROM source_table
WHERE condition
LIMIT 1000 OFFSET 1000;

-- 반복...

Python 배치 예제:

batch_size = 1000
for start in range(0, len(df), batch_size):
    batch = df[start:start+batch_size]
    batch.to_sql('your_table', engine, if_exists='append', index=False)



반응형