LLM WikiAccess-protected knowledge portal
← 스터디 홈
105편 · 약 12분

Apache DataFusion 54: LATERAL 조인·스칼라 서브쿼리 물리 실행·CDC Parquet로 Rust 쿼리 엔진이 넓어진 방법

요약

Apache DataFusion은 Rust로 작성된 임베디드 모듈형 쿼리 엔진이다. 직접 사용자를 위한 데이터베이스가 아니라, 다른 시스템이 쿼리 처리 레이어로 내장하는 라이브러리 엔진이다. InfluxDB IOx, LanceDB, Delta-rs, DataFusion-Comet(Spark 교체), Ballista 등 2025~2026년에 등장한 다수의 데이터 시스템이 DataFusion을 코어로 채택했다.

2026년 6월 12일 릴리스된 버전 54.0.0은 11주간의 개발, 740개 커밋, 기록적인 139명의 기여자를 배경으로 한다. 주요 변화는 네 가지 축이다.

  1. LATERAL 조인 지원 — 이전에는 불가능했던 행별 상관 서브쿼리 패턴
  2. 스칼라 서브쿼리 물리 실행 분리 — JOIN 재작성 대신 전용 물리 연산자 도입
  3. Sort-Merge Join 대폭 개선 — 근사 유일 조인에서 최대 20-50배 빠름
  4. Parquet 내용 정의 청킹(CDC) — 행 수 대신 데이터 내용에 따라 페이지 경계 결정

DataFusion의 위치: 임베디드 Rust 쿼리 엔진

설계 철학

DataFusion은 "쿼리 엔진을 직접 구현하지 않아도 되는 라이브러리"를 목표로 한다. 주요 특성은 다음과 같다.

  • Apache Arrow 기반: 인메모리 포맷으로 Arrow 컬럼형 레이아웃 사용. 복사 없이 Arrow 생태계와 연동.
  • 완전한 SQL 실행 경로: 쿼리 파서 → 논리 계획 → 논리 최적화 → 물리 계획 → 스트리밍 병렬 실행.
  • 모듈형 확장점: 커스텀 데이터 소스, 스칼라/집계 함수, 물리 플랜 규칙, 사용자 정의 실행기를 플러그인처럼 추가 가능.
  • 비동기 스트리밍: Tokio 런타임 위에서 파티션별 비동기 스트림으로 실행. 대형 결과를 메모리에 전부 올리지 않음.

주요 채택 사례

DataFusion 쿼리 엔진 레이어
InfluxDB IOx
시계열 DB
LanceDB
벡터·멀티모달 DB
Delta-rs
Delta Lake Rust 클라이언트
DataFusion-Comet
Spark 네이티브 실행 교체
Ballista
분산 SQL 실행
GlareDB
분석 SQL DB
↓ Apache Arrow 컬럼형 포맷 (공유 메모리 표현)
Arrow 생태계 연동
Parquet 리더/라이터
Arrow Flight
Avro 리더 (v54 교체)
ORC·CSV·JSON
DataFusion을 코어로 채택한 시스템 (2025~2026년)

버전 54의 주요 변화

1. 스칼라 서브쿼리 물리 실행 분리

이전 방식: DataFusion은 비상관 스칼라 서브쿼리(uncorrelated scalar subquery)를 JOIN으로 재작성해 처리했다.

-- 이런 서브쿼리가
SELECT name, salary - (SELECT AVG(salary) FROM employees) AS diff
FROM employees;

이 쿼리는 내부적으로 employees 전체와의 크로스 조인으로 변환됐다. 서브쿼리 결과가 상수임에도 JOIN 연산자가 동원됐고, 스칼라 함수 코드 경로 대신 조인 코드 경로가 실행됐다.

v54의 변화: 비상관 서브쿼리를 단 한 번만 평가하는 전용 물리 연산자를 도입했다. 이 연산자는 서브쿼리를 실행해 스칼라 값을 구하고, 이후 외부 쿼리의 행마다 그 값을 재활용한다.

이로 인해 세 가지 개선이 생긴다.

  • 스칼라 전용 코드 경로(AVG, SUM 등) 활용 가능
  • ORDER BY, JOIN ON, 집계 함수의 인자로 서브쿼리 사용 가능
  • 불필요한 조인 실행 제거 → 계획 단순화

2. Sort-Merge Join 대폭 개선

Sort-Merge Join은 정렬된 두 입력 스트림을 머지하는 조인 알고리즘이다. 대규모 데이터에서 해시 조인보다 메모리 효율이 높지만, 구현 복잡도가 높다.

v54는 두 가지 최적화를 도입했다.

비트셋 매치 추적: 이전에는 semi, anti, mark 조인에서 매칭 여부를 (outer행, inner행) 쌍으로 물리화(materialize)해 추적했다. v54는 행당 1비트짜리 비트셋으로 교체했다. 메모리 사용량이 대폭 줄고, near-unique 조인(LEFT, FULL)에서 배치 지연 필터링이 활성화되어 20-50배 빠른 처리량을 달성했다.

DynComparator 조인키 비교: 이전에는 행마다 조인키 컬럼의 타입을 동적으로 확인했다. v54는 DynComparator를 도입해 컬럼 타입을 한 번만 해석하고 비교 함수 포인터를 캐싱한다. 마이크로벤치마크에서 12% 빠름, TPC-H 전체에서 약 5% 개선.

3. LATERAL 조인 지원

LATERAL 조인은 FROM 절의 서브쿼리가 바깥 쿼리의 현재 행을 참조할 수 있게 하는 SQL 표준 기능이다. PostgreSQL, DuckDB에는 이미 구현돼 있었지만 DataFusion에는 없었다.

-- LATERAL: 각 부서마다 상위 3명의 급여 조회
SELECT d.name, top3.employee, top3.salary
FROM departments d,
LATERAL (
  SELECT employee, salary
  FROM employees e
  WHERE e.dept_id = d.dept_id        -- 외부 행(d) 참조
  ORDER BY salary DESC
  LIMIT 3
) AS top3;

LATERAL 없이 동일한 쿼리를 작성하려면 윈도 함수나 복잡한 CTE가 필요하다. DataFusion 위에 구축된 시스템(LanceDB의 유사도 검색 등)에서 LATERAL을 자주 사용하므로 이번 지원이 실질적인 가치를 가진다.

4. SQL Lambda 함수

배열 처리에서 인라인 변환 로직을 표현하는 lambda 문법이 추가됐다.

SELECT array_transform(scores, s -> s * 2 + 10) AS adjusted
FROM results;

이전에는 동일한 변환을 위해 UDF(사용자 정의 함수)를 별도로 등록하거나, 배열을 unpack한 뒤 처리 후 재집계하는 우회가 필요했다. Lambda는 임시 변환을 SQL 내에서 직접 표현할 수 있게 해 쿼리 복잡도를 낮춘다.

5. Avro 리더 교체

이전 Avro 리더는 DataFusion 내부 변환 코드였다. v54는 Arrow 생태계가 공유하는 arrow-avro 크레이트로 교체했다. 이 교체로 두 가지 이점이 생긴다.

  • Arrow 팀이 유지보수하므로 스키마 진화, 압축 코덱 지원이 Arrow 사양과 함께 발전
  • DataFusion 코드베이스에서 Avro 관련 코드 제거 → 유지보수 부담 감소

6. Parquet 내용 정의 청킹(CDC)

DataFusion의 Parquet 라이터가 Content-Defined Chunking(CDC) 을 지원한다.

기존 Parquet 라이터는 고정 행 수를 기준으로 페이지 경계를 만든다. 예를 들어 10만 행마다 새 Parquet 데이터 페이지를 시작한다. 중간에 행이 삽입·수정되면 그 뒤의 모든 행이 다른 페이지로 밀리고, 변경이 없던 데이터도 재작성된다.

CDC는 데이터 내용의 해시 값이 특정 패턴을 만날 때 페이지 경계를 결정한다. 행 몇 개를 삽입하거나 수정해도 그 앞뒤 경계는 움직이지 않는다.

비교 항목고정 행 수내용 정의 청킹(CDC)
페이지 경계 기준누적 행 수데이터 내용의 해시 패턴
소수 행 변경 시이후 모든 페이지 재작성변경된 범위만 재작성
중복 제거 효율낮음 (경계 이동으로 중복 탐지 실패)높음 (동일 내용은 동일 경계)
증분 저장불리함유리함

CDC는 Iceberg나 Delta Lake의 copy-on-write 패턴, 또는 S3에 증분 데이터를 자주 쓰는 파이프라인에서 저장 비용을 의미 있게 줄일 수 있다.


버전 54 변화의 누적 영향

이 변화들은 개별적으로도 의미 있지만, DataFusion을 코어로 쓰는 다운스트림 시스템에 미치는 영향이 더 크다.

  • LanceDB, pgvector 연동 시스템: LATERAL 조인으로 "각 쿼리 벡터마다 가장 가까운 K개 결과"를 SQL로 표현 가능
  • Delta Lake / Iceberg 라이터: CDC Parquet로 증분 쓰기 비용 감소, 중복 제거 품질 향상
  • DataFusion-Comet(Spark 교체): Sort-Merge Join 개선이 Spark workload에서 직접적 성능 이득
  • Ballista 분산 실행: 스칼라 서브쿼리 물리 실행이 분산 환경에서 불필요한 셔플 감소

운영 채택 기준

DataFusion을 직접 임베드하거나, DataFusion 기반 시스템을 평가하는 엔지니어를 위한 체크포인트.

  1. LATERAL / Lambda가 필요한가? — 지금까지 복잡한 UDF나 CTE로 우회했다면 v54로 쿼리 단순화 가능.
  2. Sort-Merge Join 패턴이 있는가? — DBA 벤치마크에서 Sort-Merge Join 비율이 높다면 직접 측정 필요.
  3. Parquet 증분 쓰기 비용이 문제인가? — CDC를 활성화할 경우 라이터 설정 변경 필요(옵트인).
  4. Avro 소스를 사용하는가? — arrow-avro 기반 리더가 기존 Avro 파일과 스키마 호환성 확인 권장.

Open question: DataFusion 54의 CDC Parquet 지원이 Delta-rs의 최적화 쓰기(optimized write)와 어떻게 상호작용하는지, 실제 증분 저장 절감 수치는 공개된 벤치마크 확인 필요.


정리

Apache DataFusion 54는 단일 릴리스에서 SQL 표현력(LATERAL, Lambda), 실행기 효율(스칼라 서브쿼리 물리 연산자, Sort-Merge 개선), 저장 효율(CDC Parquet), 생태계 일관성(arrow-avro)을 동시에 진전시켰다. DataFusion을 직접 사용하는 개발자뿐 아니라 DataFusion 기반 시스템을 운영하는 데이터 엔지니어에게도 실질적인 영향을 준다. 특히 Sort-Merge Join의 20-50배 개선은 코드 변경 없이 즉시 얻을 수 있는 이득이다. 릴리스 주기를 보면 DataFusion은 격월 수준으로 메이저 버전을 내놓으며, 향후 v55/v56에서는 분산 실행과 GPU 오프로드 방향의 추가 개선이 예고되어 있다.


References

  • Apache DataFusion 54.0.0 릴리스 공고. https://datafusion.apache.org/blog/output/2026/06/12/datafusion-54.0.0/
  • Apache DataFusion GitHub. https://github.com/apache/datafusion
  • DataFusion 54.0.0 릴리스 이슈. https://github.com/apache/datafusion/issues/21080
  • Arrow-avro 크레이트. https://crates.io/crates/arrow-avro
  • DataFusion-Comet (Spark 네이티브 실행 교체). https://github.com/apache/datafusion-comet
  • Apache DataFusion Ballista 54.0.0 릴리스. https://datafusion.apache.org/blog/output/2026/07/12/datafusion-ballista-54.0.0/
  • SortMergeJoinExec API 문서. https://docs.rs/datafusion/latest/datafusion/physical_plan/joins/struct.SortMergeJoinExec.html