PostgreSQL 대용량 INSERT과 COPY 성능 최적화
대량 데이터 적재 상황에서 PostgreSQL의 INSERT와 COPY 실행 흐름을 분석하고, 트랜잭션·WAL·인덱스·파티셔닝·병렬 로드 관점의 실무 최적화 전략을 정리한 기술 자료
목차
개요
대량 데이터 적재는 데이터 플랫폼 성능에 직결된다. INSERT 기반 적재와 COPY 기반 적재의 차이, 각각의 병목 지점과 설정 영향이 주요 고려 대상이다. 본문은 초보자도 이해할 수 있도록 기본 개념과 실무 적용 가능한 최적화 기법을 단계적으로 설명한다.
성능 병목의 핵심 포인트
WAL(Write-Ahead Log)와 디스크 I/O
INSERT와 COPY 모두 WAL 기록이 발생한다. WAL 쓰기와 디스크 fsync가 가장 큰 병목이 될 수 있다. wal_level, synchronous_commit, fsync 설정과 디스크의 IOPS 특성이 처리 속도에 직접적인 영향을 준다.
트랜잭션 경계와 네트워크 왕복
단일 행 INSERT는 많은 트랜잭션 오버헤드를 유발한다. 네트워크 왕복이 잦아지면 처리량이 급감한다. 배치 처리와 하나의 트랜잭션으로 묶는 방식이 오버헤드를 줄이는 핵심이다.
INSERT 최적화 전략
배치 크기와 준비된 문(statement)
여러 행을 한 번에 INSERT하는 방식이 유리하다. 준비된 문과 execute_values 같은 클라이언트 사이드 배치 기능이 CPU와 네트워크 오버헤드를 낮춘다. 배치 크기는 환경에 따라 달라지며, 보통 1k~10k 레코드 범위에서 실험이 권장된다.
인덱스·제약 조건 관리
대량 로드 중 인덱스 유지 비용이 크다. 가능하면 로드 전 인덱스 삭제 또는 비활성화 후 로드 완료 후 재생성 방식이 빠르다. 단 제약 조건과 데이터 무결성 요구사항의 영향을 검토해야 한다.
예시: psycopg2의 execute_values
import psycopg2
from psycopg2.extras import execute_values
conn = psycopg2.connect(...)
cur = conn.cursor()
rows = [(1,'a'),(2,'b'), ...]
execute_values(cur,"INSERT INTO tbl(id,val) VALUES %s", rows)
conn.commit()
COPY 명령 중심 최적화
COPY의 장점
COPY는 서버 사이드 스트리밍으로 네트워크 왕복이 적고 내부 처리가 효율적이다. 텍스트 보다 바이너리 형식이 더 빠르며, 가능하면 psql의 \copy 대신 서버 측 COPY를 활용하는 것이 유리한 환경이 존재한다.
병렬 로드 전략
PostgreSQL 자체 COPY는 단일 세션이므로 병렬성을 확보하려면 다음 전략이 사용된다:
- 테이블을 파티셔닝하여 파티션별로 병렬 COPY 수행
- 파일을 여러 조각으로 분할해 여러 세션에서 동시에 LOAD
- 외부 툴(pg_restore -j), 또는 스크립트와 GNU parallel 결합
이 접근은 IO와 CPU, WAL 동시성을 고려한 인프라 설계가 선행되어야 한다. copy 명령 병렬 postgres 키워드와 연계된 패턴이다.
예시: psql COPY
-- 서버에서 직접 읽는 경우
COPY schema.table (col1,col2) FROM '/data/part1.csv' WITH (FORMAT csv);
-- 클라이언트에서 전송하는 경우
\copy schema.table (col1,col2) FROM 'local_part1.csv' WITH (FORMAT csv)
서버 설정과 WAL 튜닝
synchronous_commit, wal_level, max_wal_size
synchronous_commit을 off로 하면 성능이 개선되나 데이터 손실 위험이 증가한다. 실무에서는 로드 기간에만 일시적으로 변경하거나 비동기 복제 아키텍처를 고려한다. wal_level은 최소한으로 설정하고, max_wal_size와 checkpoint 설정을 조율하여 체크포인트 빈도를 낮추면 I/O가 줄어든다.
unlogged 테이블과 로드 전용 환경
무결성 요구가 낮거나 일시적 데이터라면 unlogged 테이블을 활용하면 WAL 비용이 거의 사라진다. 이후 필요한 경우 정식 테이블로 복사하면 된다.
운영 관점의 권장 절차
- 로드 전 벤치마크로 병목 원인 파악
- 인덱스·트리거·제약 조건 영향 분석
- 테스트 환경에서 배치 크기와 동시 세션 수 실험
- WAL·fsync·synchronous_commit 변경은 리스크 검토 병행
- 파티셔닝, 파일 분할, 멀티스레드 로더 적용 검토
마무리
성능 향상은 단일 기법보다는 여러 요소의 조합으로 달성된다. postgres bulk insert 최적화, copy 명령 병렬 postgres, fast insert postgres 팁 같은 키워드는 각각의 기법을 연결해 검색될 때 실무적 해법을 찾는 데 도움이 된다. 최종적으로는 측정 기반 접근과 단계적 적용이 안정성과 성능을 동시에 확보하는 방법이다.