LLM WikiAccess-protected knowledge portal

WIKI

DuckDB 1.5 Variegata: VARIANT 타입·Quack 프로토콜·DuckLake로 임베디드 OLAP의 경계를 다시 그은 방법

"단일 파일 분석 DB"라는 정체성이 바뀌고 있다 DuckDB는 오랫동안 "단일 프로세스 임베디드 OLAP"으로 정의됐다. 별도 서버 없이 Python 라이브러리 하나로 로컬 파케이 파일을 수십 GB까지 분석할 수 있다는 점이 강점이었다. 하지만 "여러 사람이 동시에 쓸 수 없다"는 한계가 항상 따라붙었다. 2026년 3월 9일, DuckDB 1.5.0 "Variegata"가 출시됐다. 뉴질랜드 고유종인 파라다이스 셸덕 Par

경로human/study/content/database-frontier/74-duckdb-1-5-variegata-variant-quack-ducklake-embedded-olap.md
카테고리Study
태그#ducklake #embedded #mysql #olap #quack #study #variant

"단일 파일 분석 DB"라는 정체성이 바뀌고 있다

DuckDB는 오랫동안 "단일 프로세스 임베디드 OLAP"으로 정의됐다. 별도 서버 없이 Python 라이브러리 하나로 로컬 파케이 파일을 수십 GB까지 분석할 수 있다는 점이 강점이었다. 하지만 "여러 사람이 동시에 쓸 수 없다"는 한계가 항상 따라붙었다.

2026년 3월 9일, DuckDB 1.5.0 "Variegata"가 출시됐다. 뉴질랜드 고유종인 파라다이스 셸덕(Paradise shelduck)의 이름을 딴 이 릴리스는 세 가지 변화를 동시에 가져왔다.

  1. VARIANT 타입 — 반정형 데이터를 텍스트 JSON이 아닌 바이너리 타입으로 저장
  2. Quack 프로토콜 — HTTP 기반 클라이언트-서버 통신, 다중 사용자 동시 쓰기
  3. GEOMETRY 타입 — 공간 데이터를 Parquet 수준에서 지원

1.5.3(2026년 5월)에서 Quack이 코어 익스텐션으로 승격됐고, 1.5.5(2026년 7월 22일)까지 버그픽스와 성능 개선이 이어졌다. DuckDB 2.0은 2026년 가을, Quack의 프로덕션 안정 버전과 함께 출시 예정이다.


VARIANT 타입: JSON을 텍스트로 저장하면 생기는 문제

기존 JSON 타입의 한계

DuckDB는 오래전부터 JSON 칼럼을 지원했다. 하지만 JSON은 물리적으로 텍스트(VARCHAR)로 저장된다. 이 방식의 문제는 쿼리마다 파싱이 필요하다는 것이다.

SELECT json_extract(event_data, '$.user_id') FROM events;

이 쿼리는 event_data 칼럼의 모든 행을 문자열로 읽고, 각 행을 파싱하고, 경로를 추출한다. 인덱스 활용도 어렵고, Parquet 파일의 칼럼 푸시다운도 효과가 없다. 데이터 타입이 런타임에야 결정되므로 통계 수집도 불가능하다.

VARIANT: 행마다 타입 정보를 포함하는 바이너리 포맷

VARIANT 타입은 Snowflake의 반정형 VARIANT와 Apache Parquet의 VARIANT 스펙(2025년 추가)을 참조해 설계됐다. 핵심 차이는 각 행이 자체 타입 정보를 포함하는 바이너리 인코딩으로 저장된다는 점이다.

-- JSON 대신 VARIANT로 저장
CREATE TABLE events (
    id INTEGER,
    event_data VARIANT
);

행 수준에서 타입이 결정되므로 같은 칼럼에 숫자, 문자열, 배열, 중첩 객체가 혼재해도 타입 정보가 손실되지 않는다. 압축 효율도 높아진다. 숫자 필드가 수치 바이너리로 저장되기 때문이다.

JSON 쉬레딩(Shredding)으로 Parquet 성능 극대화

가장 중요한 기능은 JSON 쉬레딩이다. VARIANT 칼럼을 Parquet으로 쓸 때, DuckDB는 첫 번째 Row Group의 구조를 분석해 각 중첩 필드를 독립 Parquet 칼럼으로 분해한다.

기존 JSON (텍스트 저장)
{"user":1,"city":"Seoul"}
{"user":2,"city":"Busan"}
Parquet: 단일 VARCHAR 칼럼
쿼리마다 전체 파싱 필요
Predicate pushdown ❌
VARIANT 쉬레딩 (Parquet)
user 칼럼: INT64 [1, 2, ...]
city 칼럼: STRING [Seoul, ...]
타입별 독립 칼럼 인코딩
통계·블룸필터 자동 생성
Predicate pushdown ✅
Snowflake가 쓴 쉬레딩 Parquet 파일을 DuckDB가 자동으로 VARIANT로 복원해 읽는다
VARIANT JSON 쉬레딩 구조

실제 효과는 DuckDB 팀이 JSON 분석이 최대 100배 빠르다고 발표했다. 이는 Parquet 스캔 시 city = 'Seoul' 조건이 칼럼 통계만으로 처리되기 때문이다.

Snowflake가 VARIANT 칼럼을 쉬레딩해 내보낸 Parquet 파일을 DuckDB가 그대로 읽어 VARIANT로 복원할 수 있으므로, Snowflake → DuckDB 마이그레이션 경로가 자연스럽게 열린다.


Quack 프로토콜: HTTP로 다중 사용자를 지원하는 방법

왜 DuckDB에 클라이언트-서버 프로토콜이 필요한가

DuckDB를 분석 목적으로 팀에서 쓰려면 기존에는 MotherDuck(클라우드 관리 서비스) 또는 데이터를 공유 NFS/S3에 올리고 각자 별도 프로세스로 읽는 방식을 택해야 했다. 동시 쓰기는 파일 잠금 충돌로 사실상 불가능했다.

Quack은 이 제약을 HTTP 수준에서 해소한다.

Quack의 설계 원칙

Quack은 새로운 바이너리 프로토콜을 만드는 대신 HTTP 위에 구축됐다. TCP 연결 관리, TLS, 로드밸런서 통합이 HTTP 인프라를 그대로 재사용한다.

가장 중요한 기술적 결정은 DuckDB 내부 벡터 블록을 직접 직렬화한다는 것이다. 다른 데이터베이스가 결과를 JSON이나 CSV로 직렬화하고 클라이언트에서 다시 역직렬화하는 것과 달리, Quack은 DuckDB의 컬럼형 벡터를 그대로 선 상에서 전송한다. 변환 오버헤드가 없다.

Quack 클라이언트 A
Python SDK
Quack 클라이언트 B
DBeaver / JDBC
Quack 클라이언트 C
CLI / REST
↓ HTTP + 토큰 인증
Quack 서버 (DuckDB 인스턴스)
SQL 파서 / 플래너
벡터 실행 엔진
벡터 블록 직렬화
→ 결과: DuckDB 내부 벡터 포맷 그대로 전송 (변환 없음)
공유 DuckDB 파일 / DuckLake 카탈로그 / S3 Parquet
Quack 클라이언트-서버 아키텍처

인증과 운영 현황

1.5.x 기준 Quack의 인증은 서버와 클라이언트 간에 공유되는 베어러 토큰 방식이다. 세분화된 권한 제어(per-user permission)는 아직 기본 제공되지 않으며, 사용자 코드로 확장 가능한 플러그인 포인트가 마련돼 있다.

1.5.5까지는 core_nightly 채널에서 설치하며, 프로덕션 배포 전 충분한 테스트가 권장된다. DuckDB 2.0(2026년 가을 예정)에서 Quack이 안정 채널로 이동한다.

다중 동시 쓰기를 지원하므로 분석 대시보드 팀이 동일한 DuckDB 인스턴스에 여러 명이 접속하는 시나리오가 가능해진다. 단, 트랜잭션 격리 수준과 충돌 처리는 사용 전에 요구사항에 맞게 검증해야 한다.


GEOMETRY 타입: 공간 데이터를 Parquet 수준에서 지원

왜 Parquet 수준 공간 타입인가

기존 공간 확장(spatial extension)은 WKB(Well-Known Binary)를 VARCHAR나 BLOB으로 저장하는 방식이었다. Parquet 파일을 열 때 파일 수준에서 "이 칼럼은 공간 데이터"임을 알 방법이 없었다.

DuckDB 1.5는 GEOMETRY를 내장 타입으로 추가하고, Parquet 표준이 GEOMETRY를 퍼스트클래스 칼럼 타입으로 인정하는 방향과 맞춰 구현했다. Apache Iceberg와 DuckLake도 동시에 GEOMETRY/VARIANT를 지원하기 시작해, 공간 데이터를 오픈 테이블 포맷으로 관리하는 경로가 열렸다.


DuckLake: SQL 카탈로그 기반 Lakehouse

DuckDB 1.5와 함께 DuckLake 1.0이 GA(2026년 4월 13일)를 달성했다. DuckLake는 Iceberg·Delta Lake·Hudi와 달리 메타데이터 카탈로그를 SQL 데이터베이스로 관리한다.

특성Apache IcebergDuckLake
메타데이터 저장소JSON/Avro 파일 (S3 등)SQL DB (SQLite/PG/DuckDB)
카탈로그 조회파일 목록·파싱 필요SQL 쿼리로 즉시 조회
트랜잭션낙관적 잠금 + manifestSQL 트랜잭션 원자성
Iceberg 호환성기본1.5.3부터 호환 레이어 지원

DuckDB의 ducklake 익스텐션은 SQLite·PostgreSQL·DuckDB 세 가지 카탈로그 백엔드를 지원한다. 소팀 분석 환경에서는 SQLite, 다중 사용자 환경에서는 PostgreSQL을 백엔드로 쓰는 패턴이 권장된다.

1.5.3에서는 DuckLake가 Iceberg REST Catalog 호환 레이어를 추가했다. Spark·Trino·Flink 기반 파이프라인이 DuckLake 카탈로그를 Iceberg로 인식해 테이블을 읽고 쓸 수 있다는 의미다.

DuckDB (읽기/쓰기)
Spark / Trino (Iceberg 호환)
Quack 클라이언트
DuckLake 카탈로그
SQLite (로컬)
PostgreSQL (공유)
DuckDB (임베디드)
테이블 메타데이터 · 스냅샷 · 파티션 정보
데이터 레이어 (Parquet)
S3 / GCS / ADLS
로컬 파일시스템
DuckLake 아키텍처: SQL 카탈로그 + 데이터 레이크

1.5 시리즈의 핵심 변화 타임라인

버전출시일주요 변경
1.5.02026-03-09VARIANT 타입, GEOMETRY 내장, 새 CLI, Azure 쓰기, 체크포인트 동시성 개선
1.5.32026-05-20Quack을 core extension으로 승격, DuckLake Iceberg 호환, Iceberg 신규 기능
1.5.52026-07-22버그픽스, 성능 개선 (1.5 라인의 6번째 패치)
2.0예정 (2026 가을)Quack stable 채널 이동, 공식 다중 사용자 지원

운영 고려사항과 한계

사용해야 할 때

주의할 때


정리

DuckDB 1.5 "Variegata"가 그은 경계는 단순한 기능 추가가 아니다. 임베디드 DB를 협업 분석 환경으로 확장하려는 방향이 뚜렷하다.

VARIANT 타입은 Snowflake·Parquet 생태계와의 호환을 높이면서 반정형 데이터 처리 성능을 근본적으로 바꾼다. Quack은 "혼자 쓰는 DB"라는 정체성에 처음으로 실질적 균열을 낸다. DuckLake는 Iceberg를 대체하는 것이 아니라 SQL 카탈로그라는 다른 설계 공간을 탐색한다.

2026년 가을 DuckDB 2.0이 Quack을 안정 채널로 올릴 때, 이 방향이 실제 다중 사용자 OLAP 시장에서 얼마나 받아들여질지가 확인될 것이다.


References