본문 바로가기
  • plotly로 바로쓰는 동적시각화 in R & 파이썬
EPL과 유튜브 데이터로 배우는 DuckDB

DuckDB 내부 구조

by 아참형인간 2026. 6. 16.

보다 상세한 내용은 EPL과 유튜브로 배우는 DuckDB 에 수록되어 있습니다.

 

LUVIT EPL과 유튜브 데이터로 배우는 DuckDB | 이기준 - 교보문고

LUVIT EPL과 유튜브 데이터로 배우는 DuckDB | 복잡한 데이터 분석 흐름을 더 단순하게 만드는 DuckDB 최근 주목받고 있는 DuckDB를 활용해 SQL 기반 데이터 분석과 실전 프로젝트를 학습할 수 있도록 구

product.kyobobook.co.kr

 

열 기반 데이터 구조

OLAP 시스템에서 사용되는 분석 쿼리는 대부분 열 전체에 대한 요약과 집계 처리가 많습니다. 예를 들어 매출액에 대한 평균값, 최대값, 최소값 등을 산출하기 위해서는 전체 열을 대상으로 요약 함수, 집계 함수를 실행해야 합니다. 이 때문에 수백 만개의 행이 있는 데이터베이스라면 특정 열에 포함된 수백 만개의 데이터 전체를 대상으로 계산되어야 합니다. 만약 데이터가 행 단위로 저장되어 있다면 모든 행이 저장된 블록을 읽어 해당 열 데이터만을 가져와야 하지만, 열 단위로 저장되어 있다면 특정 데이터 블록 만을 읽어오면 되기 때문에 디스크나 메모리를 액세스의 최소화할 수 있습니다.

행 기반 구조와 열 기반 구조의 차이

이 때문에, DuckDB는 열 단위로 데이터를 저장합니다. , 각 컬럼의 값들이 연속적으로 저장되며, 분석 쿼리에서 특정 컬럼이 필요할 때 해당 컬럼 데이터만 읽어오면 됩니다. 이러한 방식은 필요한 컬럼만 읽으므로, 디스크 I/O와 메모리 사용량을 줄일 수 있고, 같은 컬럼 데이터는 비슷한 값이 연속적으로 저장되는 경우가 많아, 압축 효율이 높아지고, CPU SIMD 명령어 등을 활용한 대량 데이터 병렬 처리에 유리합니다.

이처럼 열 기반 저장 구조를 사용하는 DuckDB는 대규모 데이터 분석 작업에서 매우 빠른 성능을 제공하며, 특히 파이썬이나 R과 같은 환경에서도 대화형 분석 성능을 획기적으로 개선해줍니다.

SIMD

DuckDB는 데이터를 처리할 때 SIMDSIngle Instruction Multiple Data를 사용한 벡터화 처리 기법을 적극적으로 활용합니다. SIMD는 하나의 명령어로 여러 개의 데이터를 처리한다는 의미로 DuckDB에서 데이터의 벡터 처리를 위한 기본 개념입니다. 예를 들어 A열과 B열을 더하는 연산의 경우 각 열의 행 데이터를 여러 번 덧셈 처리하는 것 보다는 벡터화 된 A열과 B열을 한꺼번에 더함으로써 데이터 처리량을 줄이게 됩니다.

SIMD  개념

DuckDB는 이러한 SIMD 명령어를 데이터 처리 단계에서 적극적으로 사용합니다. 예를 들어 특정 열의 합계값을 산출해야 한다면, 해당 열 데이터를 벡터화하여 한번에 읽어오고 SIMD로 작동하는 Sum() 함수를 적용함으로써 전체 벡터의 합계값을 한 번에 산출합니다. 필터링의 경우 여러 행의 조건을 한꺼번에 비교해서 True, False 값을 산출하는 과정에서 사용하고, 자료의 변환, 문자열 비교, 해싱의 작업에도 SIMD 명령어가 활용됩니다.

Zero Copy

일반적으로 데이터베이스에 데이터를 넣거나 뺄 때는, 데이터를 메모리에 복사하고 새로운 구조로 변환하는 과정이 필요합니다. 하지만 DuckDB는 이미 메모리에 올라와 있는 데이터(pandas, Arrow )를 그대로 참조해서 사용하는 기능을 제공합니다. , 메모리 안에서 데이터를 복사하지 않고 DuckDB가 바로 읽고 쓸 수 있는 형태로 있는 그대로 연결해서 바로 쓰는 방식입니다.

이와 같은 방식을 Zero Copy라고 합니다. Zero Copy는 컴퓨터 작업에서 메모리 영역 간 데이터 복사 작업에 CPU가 관여하지 않도록 하기 위해 사용되는 기술로써, 불필요한 데이터 복사를 제거하여 CPU와 메모리 사용량을 절약할 수 있습니다.

이 방식은 네트워크를 통한 고속 파일 전송과 같이 대량의 데이터를 전송하는 작업에 특히 유용한데, 제로 카피는 커널과 사용자 공간 간에 데이터를 복사할 필요가 없으므로 입출력(I/O) 작업과 관련된 시스템 오버헤드를 줄여 시스템에서 실행되는 컴퓨터 프로그램이나 프로세스의 성능을 향상시킵니다.

 

Zero Copy 의 개념 ( 출처: https://arrow.apache.org/overview/)

DuckDB Zero Copy를 사용함으로써 얻는 장점을 다음의 세 가지 정도로 정리됩니다. 첫 번째는 메모리보다 더 큰 데이터에 대한 분석이 가능합니다. Zero Copy는 데이터를 모두 메모리에 로딩하고 작업을 하는 것이 아니기 때문에, 메인 메모리보다 큰 데이터에 대한 분석이 가능합니다. 두 번째는 복잡한 데이터 타입을 효율적으로 처리할 수 있다는 것입니다. DuckDB Arrow 벡터에 저장된 struct, list, map과 같은 중첩된 복합 데이터 유형을 지원하며, 이를 한 번에 하나의 배치(batch) 단위로 처리할 수 있습니다.  세 번째는 고급 옵티마이저가 사용하여 성능을 극대화 할 수 있습니다. DuckDB에서 사용되는 옵티마이저는 필터와 프로젝션을 Arrow 데이터 파일의 스캔에 직접 적용할 수 있기 때문에, 관련 열과 파티션만 읽게 되므로 시스템에서 쿼리 실행 속도가 크게 빨라집니다..

연합 쿼리 엔진

DuckDB는 확장 프로그램Extension을 사용해, 외부 데이터베이스 데이터를 쿼리할 수 있는 연합 쿼리 엔진Federated Query Engine을 제공합니다. 이를 통해 다양한 외부 데이터데이스 파일을 직접 사용할 수 있습니다. MySQL, Postgres 같은 DBMS 시스템, Amazon S3 같은 클라우드 스토리지 시스템에 저장된 JSON, CSV, Parquet 파일 같은 오픈 데이터 파일, Apache Iceberg, Delta Lake 같은 최신 오픈 테이블 포맷을 직접 접속하여 질의할 수 있습니다.

DuckDB에는 Hive Redshift 에서 지원하는 외부 테이블 개념은 없지만, 이와 유사하게 외부 테이블이나 데이터 파일에 대한 뷰를 만들어 사용함으로서 외부 데이터를 자체 데이터처럼 사용할 수 있습니다. 또한 전체 파일을 다운로드하지 않고도 클라우드 스토리지의 원격 파일을 쿼리할 수도 있습니다.

연합 쿼리 엔진의 개념  ( 출처 : https://medium.com/@alirezasadeghi1/duckdb-beyond-the-hype-8b1e59360cf3)

내장형 데이터베이스

DuckDB "내장 가능한" 데이터베이스 시스템입니다. 데이터베이스가 어플리케이션 내부에 포함되어 메모리와 CPU를 공유하여 실행됩니다. DuckDB 이전에 사용되던 대표적인 내장형 데이터베이스는 SQLite였습니다. DuckDB SQLite와 마찬가지로 어플리케이션 프로세스가 시작되면, DuckDB 프로세스가 실행되고 어플리케이션의 데이터 처리를 전담하게 됩니다. 처리된 데이터를 파일에 데이터를 기록하여 데이터의 영속성Duration을 보장할 수 있고, 메모리 상에서 데이터베이스를 사용할 수도 있게 구현되어 있습니다.

이와 같이 내장형 데이터베이스로 사용되기 때문에 DuckDB는 어플리케이션 실행과정에서는 기존 DBMS 시스템처럼 작동하지만, MySQL이나 PostgreSQL처럼 어플리케이션과 독립적으로 장기간 실행되는 서버 프로세스가 필요하지 않습니다. 따라서 데이터베이스 서버를 시작하고 IP/호스트 이름과 포트를 통해 데이베이스와 어플리케이션의 연결을 설정할 필요가 없습니다.

그러나 DuckDB는 내장형 데이터베이스로만 사용되지는 않습니다. 다른 데이터베이스와 마찬가지로 Beaver와 같은 SQL 전용 IDE를 사용하거나 DuckDB CLICommon Line Interface를 사용하여 대화형 SQL 엔진으로 사용할 수도 있습니다.

다중 버전 동시성 제어

자동 버전 동시성 제어MVCC, Multi-Version Concurrency Control는 말 그대로 하나의 데이터를 여러 버전으로 관리하여, 동시에 여러 작업(읽기 및 쓰기)을 안정적으로 처리할 수 있도록 하는 기법입니다.

일반적인 데이터베이스에서는 한 사용자가 데이터를 수정하는 도중에 다른 사용자가 동일한 데이터를 읽거나 수정하려고 하면 충돌conflict이 발생할 수 있으며, 이를 적절히 제어하지 못하면 데이터 이상abnormal 현상이 발생할 수 있습니다. MVCC는 이러한 문제를 해결하기 위해, 데이터를 하나의 버전만 유지하는 것이 아니라, 수정 시마다 새로운 버전을 생성하여 충돌을 방지하고 동시에 안정적인 읽기 작업이 가능하도록 합니다.

DuckDB는 주로 단일 사용자 환경에서 빠른 분석을 수행하기 위해 설계된 데이터베이스이지만, 데이터 일관성과 충돌 방지를 위해 MVCC 방식을 채택하고 있습니다. DuckDB는 테이블의 각 레코드에 대해 여러 버전의 데이터를 관리하며, 트랜잭션이 데이터를 수정할 경우 기존 데이터를 즉시 덮어쓰지 않고 새로운 버전을 생성합니다. 이때, 다른 트랜잭션이 해당 데이터를 읽고 있었다면 수정 전 버전을 사용함으로써 일관성을 유지할 수 있습니다.

MVCC의 이러한 특성 덕분에, 각 트랜잭션은 자신이 시작할 때 존재하던 데이터 버전을 끝까지 사용할 수 있으며, 쓰기 작업 시에도 충돌 없이 새로운 버전을 생성하여 처리됩니다. 이 방식은 데이터베이스에서 성능에 영향을 줄 수 있는 Locking(잠금) 메커니즘을 사용하지 않고도 일관성을 유지할 수 있는 장점이 있습니다.

DuckDB와 같은 분석 전용 데이터베이스는 일반적으로 동시에 여러 사용자가 읽기 작업을 수행할 수 있는 구조이지만, 쓰기 작업의 빈도는 낮은 편입니다. 이와 같은 특성을 고려할 때, 읽기 성능을 극대화할 수 있는 MVCC는 매우 적합한 동시성 제어 기법이며, DuckDB는 이를 채택하여 안정적이고 빠른 분석 환경을 제공합니다.

 

댓글