본문 바로가기
C.W.K.
Stream
Lesson 06 of 10 · published

대량 작업과 COPY

~12 min · operations, bulk

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

왕복 횟수가 처리량을 가른다

1000개의 INSERT를 따로 보내면 1000번 왕복하지만, 1000행을 한 INSERT로 보내면 왕복은 한 번이야. 행별 INSERT와 여러 행 INSERT 사이에는 보통 50-100× 차이가 나고, 아주 큰 적재에서는 COPY가 여러 행 INSERT보다 다시 한 자릿수 배 더 빠를 수 있어.

큰 입력은 COPY로 흘려보내

COPY FROM STDIN은 행마다 SQL을 해석하지 않고 데이터를 테이블로 직접 보내. 로컬 파일은 \copy로 전송할 수 있고, 10억 행을 적재할 때는 \copypgloader의 binary COPY를 검토해. 텍스트 COPY보다 binary COPY가 파싱 비용까지 줄여 더 빠를 수 있어.

크기에 맞는 도구를 골라

일반 앱 쓰기는 여러 행 INSERT, 큰 가져오기·ETL·seed는 COPY가 맞아. 10만 행으로 세 방식을 직접 재봐.

Code

CSV를 가져오는 psql \copy·bash
# CSV 를 테이블에 직접 로드
\copy products (sku, name, price) FROM 'products.csv' WITH (FORMAT csv, HEADER true)

# 서버측 COPY (서버 프로세스가 접근 가능한 파일 필요)
COPY products (sku, name, price) FROM '/var/data/products.csv' WITH (FORMAT csv, HEADER true);
앱에서 여러 행을 한 번에 INSERT하기·python
import psycopg
rows = [...]  # (sku, name, price) tuple 리스트

with conn.cursor() as cur:
    cur.executemany(
        "INSERT INTO products (sku, name, price) VALUES (%s, %s, %s)",
        rows,
    )
# psycopg 3 가 효율적으로 batch; psycopg 2 는 execute_values 필요
Python 반복 가능 객체를 psycopg COPY로 넣기·python
import psycopg
with conn.cursor() as cur:
    with cur.copy("COPY products (sku, name, price) FROM STDIN WITH (FORMAT csv)") as copy:
        for sku, name, price in rows:
            copy.write_row((sku, name, price))

External links

Exercise

행 10만 개가 든 CSV를 PostgreSQL 테이블에 세 방식으로 넣어. 행별 INSERT, 1000개씩 묶은 다중 행 INSERT, COPY를 각각 실행해 시간을 재고 속도 비율을 기록해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.