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

시작과 기준선

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

파일·레이크 분석

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

분석 SQL·연동

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

성능·운영

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

부록

템플릿참고 자료검증 리포트업데이트 내역
핸드북›DuckDB 고급 활용›Friendly SQL과 매크로

Friendly SQL과 매크로

DuckDB의 Friendly SQL, table macro, PIVOT/UNPIVOT을 분석 코드 품질로 연결합니다.

핵심 요약

  • Friendly SQL은 짧게 쓰려는 문법이 아니라, 분석 SQL을 덜 깨지고 검토하기 쉽게 만드는 도구입니다.
  • GROUP BY ALL/ORDER BY ALL, SELECT * EXCLUDE/REPLACE, UNION BY NAME으로 집계 누락·PII 제외·schema evolution을 다룹니다.
  • PIVOT은 편리하지만 고 cardinality 컬럼에서 메모리·컬럼 폭이 폭발하므로 pivot 값을 제한하거나 long format을 유지해 BI에서 pivot합니다.
  • MACRO는 SQL 문자열 조립보다 안전하지만 권한 경계가 아니므로 untrusted 입력을 table name·expression으로 넘기지 않습니다.
  • 코드 리뷰에서는 publish mart의 SELECT * 잔존, GROUP BY ALL granularity, PIVOT cardinality, macro의 pure SQL 여부를 점검합니다.

DuckDB의 SQL dialect는 분석가가 반복해서 쓰는 boilerplate를 잘 줄여줍니다. DBA 입장에서 중요한 건 "짧게 쓰는 문법"이 아니라, 분석 SQL을 덜 깨지고 검토하기 쉬운 형태로 만든다는 점입니다.

자주 쓰는 Friendly SQL

기능용도예시
GROUP BY ALLselect list 기준 group by 자동화집계 컬럼 누락 방지
ORDER BY ALLdeterministic sample/review회귀 비교
SELECT * EXCLUDE넓은 테이블에서 일부 제외PII 컬럼 제외
SELECT * REPLACE컬럼 유지하며 일부 변환timezone/cast 보정
UNION BY NAME컬럼 순서가 다른 결과 결합schema evolution 대응
PIVOT/UNPIVOTwide/long 변환리포트용 mart
SELECT
  date_trunc('day', event_time) AS day,
  event_name,
  count(*) AS events
FROM events
GROUP BY ALL
ORDER BY ALL;
SELECT
  * EXCLUDE (raw_payload, internal_note),
  event_time AT TIME ZONE 'Asia/Seoul' AS event_time_kst
FROM raw_events;

PIVOT

PIVOT daily_events
ON event_name
USING sum(events)
GROUP BY day
ORDER BY day;

PIVOT은 편리하지만 고 cardinality 컬럼에 쓰면 메모리와 컬럼 폭이 폭발합니다. 운영 mart라면 pivot 대상 값을 제한하거나, long format을 유지한 채 pivot은 BI에서 처리하는 편이 낫습니다.

Macro

DuckDB macro는 반복 분석 로직을 catalog에 넣는 방법입니다.

CREATE OR REPLACE MACRO is_paid_plan(plan) AS
  plan IN ('pro', 'team', 'enterprise');

CREATE OR REPLACE MACRO revenue_by_day(source_table) AS TABLE
  SELECT
    date_trunc('day', paid_at) AS day,
    sum(amount) AS revenue
  FROM query_table(source_table)
  GROUP BY ALL;

FROM revenue_by_day('payments');

macro는 SQL 문자열 조립보다 안전하지만 권한 경계는 아닙니다. untrusted 입력을 table name이나 expression으로 넘기는 구조는 피합니다.

코드 리뷰 기준

체크이유
SELECT *가 publish mart에 남아 있지 않은가schema drift가 downstream을 깨뜨림
GROUP BY ALL이 의도한 granularity와 맞는가select list 변경이 group key를 바꿈
PIVOT 대상 cardinality가 제한되어 있는가OOM 위험
macro가 hidden side effect 없이 pure SQL인가재현성
ORDER BY ALL이 테스트 output에 있는가diff 안정성

참고 자료

  • Friendly SQL
  • CREATE MACRO Statement
  • PIVOT Statement
  • UNPIVOT Statement

관련 문서

Go / Pivot / Kill

Agentic MVP · Agentic MVP는 완성이 아니라 결정을 배송합니다. Go/Pivot/Kill 판정 신호, Pivot 7종, A~D 증거 등급, 확증 편향·매몰 비용 함정을 피하는 학습 리포트 작성법을 다룹니다.

보안 Hardening 체크리스트

로컬 노트북, CI 배치, 내부 분석 서비스별 DuckDB 보안·리소스·확장 정책을 표준화합니다.

검증 리포트

DuckDB 고급 활용 핸드북의 구조·링크·공식 근거·버전 기준 검증 결과

Ch4. 마이그레이션 전략

Prisma Production Guardrails · Expand/Contract 기반 무중단 마이그레이션과 위험 변경 분리 전략

Lakehouse 포맷

Iceberg, Delta, DuckLake를 DuckDB에서 읽고 쓰는 범위와 extension 안정성 기준을 정리합니다.

시계열·분석 SQL

ASOF JOIN, window, QUALIFY, sampling, 분석용 join 패턴을 DuckDB에서 사용하는 기준을 정리합니다.

On this page

자주 쓰는 Friendly SQLPIVOTMacro코드 리뷰 기준참고 자료