본문으로 바로가기
리옵트 핸드북
리옵트 핸드북
DuckDB 고급 활용

시작과 기준선

포지셔닝과 적합한 워크로드버전·설치·런타임 기준연결·스토리지 모델실행 가능한 예제 번들

파일·레이크 분석

CSV·JSON 수집Parquet 레이크 모델링다중 파일·스키마 진화파티션 쓰기와 오브젝트 스토리지Lakehouse 포맷

분석 SQL·연동

Friendly SQL과 매크로시계열·분석 SQL중첩·반정형 데이터Python·Arrow·Polars·BIdbt·MotherDuck·Ibis 생태계Materialization·Index·통계

성능·운영

성능 프로파일링벤치마크·프로파일링 실습메모리·spill·실패 모드동시성·보안·운영보안 Hardening 체크리스트

부록

템플릿참고 자료검증 리포트업데이트 내역
핸드북›DuckDB 고급 활용›연결·스토리지 모델

연결·스토리지 모델

in-memory, file-backed database, ATTACH, read-only 연결, WAL, checkpoint를 운영 관점으로 정리합니다.

핵심 요약

  • in-memory, file-backed, read-only, ATTACH, direct file scan은 각각 적합한 작업이 다르므로 "이 쿼리가 상태를 남기는가"를 먼저 구분합니다.
  • read-write 모드는 단일 프로세스가 읽고 쓰며, 여러 프로세스가 공유해야 하면 access_mode='READ_ONLY'로 제한하고 Python은 thread별 .cursor()를 분리합니다.
  • crash 복구는 WAL replay에 기대지 말고 staging .duckdb와 publish Parquet를 분리해 성공 후에만 final prefix로 노출합니다.
  • ATTACH는 파일 DB를 namespace로 나누기 좋지만 권한 경계가 아니므로 민감 데이터는 파일 경로와 OS 권한으로 분리합니다.
  • in-memory 결과를 보존하려면 EXPORT DATABASE나 COPY로 명시적으로 파일에 남깁니다.

DuckDB에서는 연결 방식이 곧 운영 모델입니다. 같은 SQL이라도 in-memory 연결, 파일 DB 연결, read-only 연결, ATTACH 조합에 따라 실패 모드가 달라집니다. DBA는 "이 쿼리가 상태를 남기는가"부터 구분합니다.

연결 모드

모드예시적합한 작업
in-memoryduckdb.connect()notebook, 임시 검증, one-shot 변환
file-backedduckdb.connect('analytics.duckdb')반복 분석, 통계 유지, local mart
read-onlyaccess_mode = 'READ_ONLY'여러 프로세스가 같은 파일을 조회
attached databaseATTACH 'raw.duckdb' AS rawDB 파일 간 이동, stage/main 분리
direct file scanFROM 's3://bucket/*.parquet'데이터 레이크 탐색

단일 writer와 다중 reader

DuckDB는 in-process 엔진입니다. read-write 모드에서는 한 프로세스가 읽고 쓰며, 그 프로세스 안에서는 여러 writer thread가 동작합니다. 여러 프로세스가 같은 DB 파일에 동시에 write하는 구조는 설계 기준이 아닙니다. 여러 프로세스가 공유해야 한다면 read-only 연결로 제한합니다.

-- read-only 연결은 client별 connection option으로 설정한다.
-- SQL 안에서는 현재 연결의 쓰기 가능성을 운영 문서로 명시한다.
SELECT current_database();

Python에서는 thread별 cursor를 분리합니다.

import duckdb
from threading import Thread

con = duckdb.connect("analytics.duckdb")

def run_query():
    local_con = con.cursor()
    return local_con.execute("SELECT count(*) FROM events").fetchone()

DB 파일과 WAL

file-backed DuckDB는 main database file과 write-ahead log를 씁니다. crash 이후에는 새 세션이 WAL을 replay해 복구합니다. 하지만 분석 batch를 안전하게 운영하려면 WAL 복구에 기대기보다 staging 파일과 publish 파일을 분리합니다.

대상권장
원본 파일읽기 전용 prefix로 유지
staging DBbatch run id가 들어간 임시 .duckdb
publish output성공 후에만 final Parquet prefix로 노출
실패 처리staging DB, temp directory, partial output 삭제

ATTACH 패턴

ATTACH 'raw.duckdb' AS raw;
ATTACH 'mart.duckdb' AS mart;

CREATE OR REPLACE TABLE mart.daily_revenue AS
SELECT date_trunc('day', paid_at) AS day, sum(amount) AS revenue
FROM raw.payments
GROUP BY ALL;

ATTACH는 파일 DB를 namespace로 나누기 좋지만, 복잡한 권한 경계가 아닙니다. 민감 데이터와 공유 mart는 파일 경로와 OS 권한으로 분리합니다.

in-memory를 파일로 남기기

임시 분석으로 시작했다가 결과를 보존해야 하면 EXPORT DATABASE나 COPY로 명시적으로 남깁니다.

COPY (
  SELECT customer_id, sum(amount) AS lifetime_value
  FROM payments
  GROUP BY customer_id
) TO 'out/customer_ltv.parquet' (FORMAT parquet, COMPRESSION zstd);

참고 자료

  • Concurrency
  • Copying an In-Memory Database to a File
  • Crashes
  • EXPORT and IMPORT DATABASE

관련 문서

포지셔닝과 적합한 워크로드

DuckDB를 서버형 DB, 파일 포맷, 데이터프레임 도구와 비교해 언제 써야 하는지 정리합니다.

Ch3. Prisma Postgres 활용

Prisma Production Guardrails · Prisma Postgres를 프로덕션에서 안정적으로 활용하기 위한 연결/캐시/백업/브랜치 운영 가이드

버전·설치·런타임 기준

DuckDB current, LTS, CLI, Python client, extension 버전을 분석 운영 기준선으로 고정합니다.

실행 가능한 예제 번들

작은 CSV·JSON 샘플과 DuckDB SQL 스크립트로 수집, Parquet 변환, profiling을 직접 실행합니다.

On this page

연결 모드단일 writer와 다중 readerDB 파일과 WALATTACH 패턴in-memory를 파일로 남기기참고 자료