PostgreSQL · 2026-03-23

PostgreSQL 대용량 INSERT과 COPY 성능 최적화

대량 데이터 적재 상황에서 PostgreSQL의 INSERT와 COPY 실행 흐름을 분석하고, 트랜잭션·WAL·인덱스·파티셔닝·병렬 로드 관점의 실무 최적화 전략을 정리한 기술 자료

작성일 : 2026-03-23 ㆍ 작성자 : 관리자
post
목차

개요

대량 데이터 적재는 데이터 플랫폼 성능에 직결된다. 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 팁 같은 키워드는 각각의 기법을 연결해 검색될 때 실무적 해법을 찾는 데 도움이 된다. 최종적으로는 측정 기반 접근과 단계적 적용이 안정성과 성능을 동시에 확보하는 방법이다.

postgresql postgres bulk insert 최적화 copy 명령 병렬 postgres fast insert postgres 팁 COPY 최적화 WAL 튜닝 대량 로드 파티셔닝 인덱스 관리