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

시작과 기준선

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

파일·레이크 분석

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

분석 SQL·연동

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

성능·운영

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

부록

템플릿참고 자료검증 리포트업데이트 내역
핸드북›DuckDB 고급 활용›메모리·spill·실패 모드

메모리·spill·실패 모드

larger-than-memory, temp directory, OOM, blocking operator, thread 제한을 운영 runbook으로 정리합니다.

핵심 요약

  • DuckDB는 disk spill로 larger-than-memory를 지원하지만 모든 연산이 spill되지는 않습니다. OOM killer나 temp directory 부족으로 프로세스가 죽을 수 있으니 실패 모드별로 대응을 준비해 둡니다.
  • memory_limit 기본은 RAM 80%이고 buffer manager에만 적용됩니다. buffer manager 밖 메모리를 쓰는 연산이 있어 운영에서는 전체 RAM의 50-60%로 낮추는 편이 안정적입니다.
  • grouping·joining·sorting·windowing은 blocking operator로 입력 전체/큰 중간 상태가 필요하므로 사전 필터, key 축소, partition별 처리로 다룹니다.
  • OOM 대응은 EXPLAIN ANALYZE로 operator 확인 → threads 감소 → preserve_insertion_order=false → temp_directory 이동 → memory_limit 하향 → stage table 분해 순서입니다.
  • OutOfMemoryException은 내부 한도, process Killed는 OS OOM killer, temp full은 spill 공간 부족으로 구분해 조치를 매핑합니다.

DuckDB는 larger-than-memory workload를 지원하고 disk spill을 씁니다. 하지만 모든 연산이 항상 spill되지는 않고, Linux OOM killer나 temp directory 부족으로 프로세스가 죽기도 합니다. DBA가 준비할 것은 "메모리 한도 설정"이 아니라 "실패 모드별 대응"입니다.

기본 설정

SET memory_limit = '8GB';
SET threads = 4;
SET temp_directory = '/mnt/fast-ssd/duckdb.tmp';
SET max_temp_directory_size = '200GB';
SET preserve_insertion_order = false;

memory_limit 기본값은 RAM의 80%이고, 이 한도는 buffer manager에만 적용됩니다. 일부 연산은 buffer manager 밖 메모리를 쓰기 때문에, 운영에서는 전체 RAM의 50-60% 수준으로 낮추는 편이 오히려 안정적입니다.

Blocking operator

DuckDB 문서는 grouping, joining, sorting, windowing을 대표적인 blocking operator로 설명합니다. 이런 연산은 입력 전체나 큰 중간 상태가 있어야 돌아갑니다.

연산위험대응
GROUP BYhigh cardinality state사전 필터, key 축소
JOINcardinality explosionkey uniqueness, join order 점검
ORDER BY전체 정렬 bufferlimit pushdown, partition별 처리
windowpartition별 statepartition key와 frame 제한
PIVOT내부 list 사용pivot value 제한

OOM 대응 순서

  1. EXPLAIN ANALYZE로 어느 operator에서 커지는지 확인합니다.
  2. threads를 줄입니다.
  3. preserve_insertion_order = false를 검토합니다.
  4. temp_directory를 빠르고 여유 있는 디스크로 옮깁니다.
  5. memory_limit을 전체 RAM보다 낮게 잡아 OS OOM killer를 피합니다.
  6. query를 stage table로 나눠 중간 폭발 지점을 분리합니다.
CREATE OR REPLACE TABLE stage_filtered AS
SELECT *
FROM read_parquet('s3://lake/events/**/*.parquet')
WHERE event_date >= DATE '2026-05-01';

CREATE OR REPLACE TABLE stage_agg AS
SELECT user_id, event_name, count(*) AS events
FROM stage_filtered
GROUP BY ALL;

temp directory 운영

기준권장
위치OS root가 아닌 빠른 SSD mount
용량예상 spill보다 충분히 크게
격리job/run별 temp path
정리실패 후 temp directory cleanup
모니터링disk free, inode, write throughput

실패 모드 매핑

메시지/증상가능한 원인조치
OutOfMemoryExceptionDuckDB 내부 한도 도달threads 감소, query 분해
process KilledOS OOM killermemory_limit 낮춤, dmesg 확인
temp directory fullspill 공간 부족max_temp_directory_size, mount 용량 확인
long checkpoint큰 DB 파일과 변경batch window 조정
crash 후 fatal modeinternal error 후 invalidatedprocess 재시작, 최소 재현 제출

참고 자료

  • Tuning Workloads
  • Out of Memory Errors
  • Out-of-Memory Issues
  • Environment
  • Limits

관련 문서

템플릿

DuckDB 분석 운영에 바로 복사해 쓰는 세션 설정, S3, Parquet, profiling, OOM 대응 템플릿

성능 프로파일링

EXPLAIN, EXPLAIN ANALYZE, profiling output으로 DuckDB 쿼리 병목을 읽는 기준을 정리합니다.

벤치마크·프로파일링 실습

같은 DuckDB 쿼리를 파일 레이아웃과 세션 설정별로 비교하는 재현 가능한 실습 절차입니다.

동시성·보안·운영

DuckDB의 단일 프로세스 write 모델, read-only 공유, extension 보안, untrusted SQL 방어 기준을 정리합니다.

On this page

기본 설정Blocking operatorOOM 대응 순서temp directory 운영실패 모드 매핑참고 자료