2025. 2. 15. 09:44ㆍIT/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)
'IT > Oracle' 카테고리의 다른 글
정적 SQL(Static SQL)과 동적 SQL(Dynamic SQL) 비교 (0) | 2025.02.15 |
---|---|
오라클 UNDO 최소화 및 데이터 저장 전략(ㅇ) (0) | 2025.02.15 |
Common Table Expression (CTE)(ㅇ) (1) | 2025.02.14 |
BETWEEN으로 존재하지 않는 파티션 데이터 조회 (1) | 2025.02.14 |
Job Number 조회 (1) | 2025.02.14 |