
DuckDB가 또 빨라졌어요
데이터 분석을 조금이라도 해보셨다면 DuckDB라는 이름을 들어보셨을 거예요. 흔히 “분석용 SQLite”라고 부르는데요, 따로 DB 서버를 띄우지 않고 내 프로그램(프로세스) 안에서 바로 돌아가는 분석 전용 데이터베이스거든요. pip install duckdb 한 줄이면 설치가 끝나요. CSV나 Parquet 파일도 테이블처럼 바로 SQL로 조회할 수 있어서 데이터 엔지니어, 분석가, 백엔드 개발자 사이에 빠르게 퍼졌어요.
2024년 6월에 1.0이 나오면서 “이제 프로덕션에서 써도 된다”는 안정성을 약속했고, 이번에 메이저 버전인 2.0이 나왔어요. DuckDB 기반 클라우드 서비스를 운영하는 MotherDuck 팀이 “2.0은 왜 더 빠른가”를 엔진 내부 관점에서 풀어낸 글을 공개했는데요. 세부 벤치마크 수치와 개별 최적화 항목은 원문에 잘 정리돼 있으니 같이 보시는 걸 추천해요. 여기서는 그 개선들을 제대로 이해하려면 알아야 하는 DuckDB 엔진의 기본기와 메이저 버전이 갖는 의미를 중심으로 풀어볼게요.
DuckDB는 원래 왜 빨랐을까
첫째, 데이터를 컬럼 단위로 저장해요. 엑셀 시트를 떠올려보세요. MySQL 같은 일반적인 DB는 한 줄(행) 단위로 데이터를 붙여서 저장해요. 회원 한 명의 이름, 나이, 주소가 한 덩어리죠. 반면 DuckDB는 열 단위로 저장해요. “매출 합계”를 구할 때는 매출 열만 쭉 읽으면 되니까 디스크에서 쓸데없는 데이터를 읽어올 일이 확 줄어들거든요. 같은 종류의 값이 모여 있으니 압축도 훨씬 잘 되고요.
둘째, 벡터화 실행(vectorized execution)을 해요. 이게 뭐냐면, 값을 하나씩 처리하지 않고 기본 2048개씩 묶어서 한 번에 처리하는 방식이에요. 택배를 한 상자씩 오토바이로 나르는 것과 트럭에 가득 실어 나르는 것의 차이랄까요. 함수 호출 오버헤드가 줄고, CPU 캐시를 잘 활용하게 되고, SIMD(명령어 하나로 여러 값을 동시에 계산하는 CPU 기능) 최적화도 쉬워져요.
셋째, 모든 코어를 알뜰하게 써요. DuckDB는 데이터를 작은 조각(morsel)으로 쪼개 두고, 놀고 있는 CPU 코어가 다음 조각을 가져가서 처리하는 식으로 병렬화해요. 몇몇 코어만 일하고 나머지는 노는 상황이 줄어들죠.
넷째, 안 읽어도 되는 데이터는 아예 안 읽어요. DuckDB 자체 저장 포맷과 Parquet은 데이터 덩어리(row group)마다 최솟값·최댓값 같은 통계를 갖고 있어요. 그래서 WHERE date >= '2026-10-01' 같은 조건이 붙으면 해당 날짜가 없는 덩어리는 통째로 건너뛰어요. 필요한 컬럼만 골라 읽는 projection pushdown도 같은 원리고요.
메이저 버전이 성능에 중요한 이유
“이미 빠른데 어떻게 더 빨라지지?” 싶으실 텐데요. 분석 쿼리에서 시간을 가장 많이 잡아먹는 건 보통 조인, 집계(GROUP BY), 정렬이에요. 데이터가 메모리보다 클 때 디스크로 넘겼다가 다시 읽어오는 처리(out-of-core)도 그렇고요. DuckDB 팀은 1.x 후반에 정렬 구현을 새로 설계하는 등 이런 핵심 연산자들을 꾸준히 갈아엎어 왔어요.
여기서 메이저 버전 번호가 의미를 가져요. 1.x에서는 “예전 버전으로 만든 DB 파일도 새 버전에서 읽을 수 있다”는 호환성 약속을 지켜야 해서 저장 구조나 내부 표현을 과감하게 바꾸기가 쉽지 않았거든요. 메이저 버전은 이런 제약을 다시 따져볼 수 있는 기회예요. 그래서 2.0의 개선 내용을 볼 때는 “어떤 연산자가 몇 % 빨라졌나”와 함께 “어떤 내부 구조를 바꿔서 가능해졌나”를 같이 보면 훨씬 재미있게 읽혀요.
경쟁 도구들과 비교하면
Polars는 Rust로 만든 DataFrame 라이브러리로, pandas 대체재로 많이 쓰여요. DuckDB는 SQL 중심이고 Polars는 메서드 체이닝 API 중심이라는 차이가 있어요. 다만 둘 다 Apache Arrow 포맷을 지원해서 데이터를 거의 복사 없이 주고받을 수 있어요. ClickHouse는 서버로 띄우는 대규모 분석 DB라서 수십 TB 규모의 실시간 분석에 강해요. Apache DataFusion은 쿼리 엔진을 직접 만들려는 사람들을 위한 부품 라이브러리에 가깝고요.
DuckDB의 포지션은 분명해요. “단일 머신에서 최대한 빠르게, 설치는 최대한 간단하게.” 요즘 노트북엔 코어 10개 이상, 메모리 수십 GB가 기본이죠. 그러다 보니 예전엔 Spark 클러스터를 띄워야 했던 작업 상당수가 노트북 한 대로 내려오고 있어요. MotherDuck이 DuckDB를 클라우드와 연결하고, DuckDB 팀이 2025년에 메타데이터를 SQL DB로 관리하는 레이크하우스 포맷 DuckLake를 내놓은 것도 같은 흐름이에요.
한국 개발자에게 주는 시사점
실무에서 당장 써볼 곳이 많아요. 사내 백오피스 리포트, 주간 매출 집계, S3에 쌓아둔 로그 분석 같은 작업은 DuckDB 하나로 충분한 경우가 많거든요. 예를 들어 SELECT region, sum(amount) FROM 's3://my-bucket/logs/*.parquet' GROUP BY region; 같은 쿼리를 별도 인프라 없이 노트북에서 바로 돌릴 수 있어요.
다만 메이저 버전인 만큼 업그레이드 전에 릴리스 노트의 호환성 항목은 꼭 확인하세요. 기존 .duckdb 파일을 그대로 열 수 있는지, 쓰고 있는 확장(extension)이 새 버전을 지원하는지, Python·Node 바인딩 버전도 같이 올려야 하는지 같은 것들이요. 운영 환경이라면 기존 파일을 복사해서 먼저 테스트해보는 게 안전해요.
마무리
한줄 정리: DuckDB 2.0은 이미 빠른 엔진이 메이저 버전을 계기로 더 깊은 곳까지 손본 결과물이에요. 빠른 원리를 알고 나면 내 데이터 작업에 어디까지 쓸 수 있을지도 보여요.
여러분은 지금 데이터 분석에 뭘 쓰고 계신가요? pandas, Polars, DuckDB, 아니면 여전히 Spark나 BigQuery인가요? “이 규모까지는 DuckDB로 충분했다” 하는 경험이 있다면 댓글로 공유해주세요!
🔗 출처: Hacker News