C.W.K.
Stream
Lesson 06 of 10 · published

Bulk 연산과 COPY

~12 min · operations, bulk

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

행당 INSERT vs 배치당 INSERT

1000 별도 INSERT statement 가 1000 라운드트립. 1000 행 한 INSERT 가 한 라운드트립. 속도 향상 보통 50-100×. 진짜 큰 데이터 로드엔 COPY 가 multi-row INSERT 보다 한 자릿수 더 빠름.

속도 위계

  1. 루프의 single-row INSERT — 가장 느림, 각 라운드트립.
  2. Multi-row INSERT — 빠름, 배치당 한 라운드트립.
  3. COPY FROM STDIN — 가장 빠름, 데이터를 테이블로 직접 stream (각 행을 별도 statement 로 파싱 안 함).
  4. Binary 포맷의 COPY — 모든 거의 가장 빠름; 텍스트 파싱 완전 우회.

어느 거 쓸지

일반 앱 write: multi-row INSERT (대부분 ORM 이 묵시적으로). 큰 import, ETL, seeding: COPY. 십억 행 로드: \copy 또는 pgloader 의 binary 포맷 COPY.

Code

CSV import 위한 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);
Multi-row INSERT (앱 default)·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 iterable 에서 COPY (psycopg)·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 를 Postgres 테이블에 세 방식으로 import: 행별 INSERT, multi-row INSERT (1000 배치), COPY. 각각 시간. 속도 비율 문서화.

Progress

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

댓글 0

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

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