CSV를 Parquet으로 바꾸면 빨라질까? DuckDB 쿼리로 보는 차이

주문 CSV에서 날짜와 금액 두 열만 읽어 한 달 매출을 내는데, 매번 파일 전체를 훑느라 느리다. Parquet으로 바꾸면 어떤 쿼리가 빨라지고 어떤 쿼리는 그대로일까?

CSV를 Parquet으로 바꾸면 빨라질까? DuckDB 쿼리로 보는 차이
세 줄 요약
  • Parquet은 열별 저장과 행 그룹 통계를 이용해 쿼리에 필요 없는 데이터를 덜 읽을 수 있다.
  • 필터에 맞지 않는 그룹을 건너뛰려면 통계와 데이터 배치가 뒷받침돼야 한다.
  • 파일 직접 집계에는 Parquet, 같은 데이터를 반복해서 조인하는 작업에는 DuckDB 테이블 적재도 유력하다.

열 몇 개와 특정 기간만 읽는 집계에 유리하다

주문 CSV에서 날짜와 금액만 읽어 한 달 매출을 계산한다면 Parquet으로 바꿀 이유가 있다. DuckDB의 Parquet 읽기는 쿼리에 필요한 열만 파일에서 읽고, 필터 조건을 파일을 읽는 단계에 적용한다. 여기서 필요한 열에는 결과로 출력하는 열뿐 아니라 WHERE나 집계에 쓰는 열도 포함된다.

CSV는 한 행 안에 값이 이어지는 텍스트다. DuckDB의 형식 비교 설명에 따르면 사용하지 않는 열의 형 변환과 복사는 줄일 수 있어도 값을 건너뛰기 위한 파싱은 필요하다. Parquet은 열을 나눠 저장하므로 불필요한 열을 읽는 작업 자체를 줄일 수 있다.

따라서 차이는 파일 확장자보다 “이번 질문에 필요 없는 데이터를 얼마나 읽지 않아도 되는가”에서 나온다. 수백 개 열 가운데 날짜·금액만 쓰는 작업과 모든 열을 전부 꺼내는 작업에 같은 속도 배수를 기대할 수는 없다.

WHERE를 쓴다고 모든 불필요한 행이 바로 사라지지는 않는다

Parquet은 행을 여러 그룹으로 나누고, 각 그룹 안에 열별 데이터를 저장한다. DuckDB는 파일에 있는 최솟값·최댓값 같은 통계로 조건에 맞을 가능성이 없는 그룹을 건너뛸 수 있다. 해당 통계가 있고 필터와 비교할 수 있어야 이런 이점이 생긴다.

예를 들어 10월 주문만 읽을 때 한 그룹의 주문 날짜가 전부 9월이면 그 그룹은 읽지 않아도 된다. 반대로 모든 그룹에 1월부터 12월까지의 주문이 뒤섞여 있으면 날짜 범위만으로 제외하기 어렵다. 이는 작동 원리를 설명하기 위한 예시다.

DuckDB의 작성 팁은 자주 필터링하는 열로 정렬해 그룹별 범위를 좁히는 방법을 제시한다. 다만 그룹을 무조건 작게 나누는 것도 답은 아니다. 그룹마다 메타데이터를 처리하는 비용이 있고, 전체를 읽는 집계와 일부만 읽는 질의의 요구가 다르다.

병렬 처리에도 영향을 준다. 성능 가이드에 따르면 파일 하나가 거대한 행 그룹 하나로 돼 있으면 그 파일의 그룹 스캔을 여러 스레드로 나눌 수 없다. 느린 Parquet을 만났다면 형식 이름뿐 아니라 행 그룹 구성도 확인할 이유가 있다.

필요한 쿼리를 먼저 정한 뒤 파일을 변환한다

아래는 orders.csv에 DATE 형식의 order_date와 수치형 amount가 있다는 가상 예시다. 실제 파일에서는 먼저 스키마를 확인해 날짜와 금액이 어떤 타입으로 읽히는지 봐야 한다.

DESCRIBE SELECT * FROM read_csv('orders.csv');

타입이 맞으면 다음처럼 날짜순으로 정렬해 새 Parquet 파일을 만들 수 있다. COPY의 Parquet 출력과 정렬 예시를 조합한 SQL이다. 실제 열 이름이 다르거나 날짜가 문자열로 읽혔다면 입력 쿼리부터 조정해야 한다.

COPY (
  SELECT * FROM read_csv('orders.csv')
  ORDER BY order_date
) TO 'orders-sorted.parquet' (FORMAT parquet, COMPRESSION zstd);

만든 파일은 테이블에 적재하지 않고 바로 질의할 수 있다. 아래 쿼리는 2026년 10월 주문 금액을 합산한다.

SELECT sum(amount) AS total_amount
FROM read_parquet('orders-sorted.parquet')
WHERE order_date >= DATE '2026-10-01'
  AND order_date < DATE '2026-11-01';

효과를 비교할 때는 원본과 변환본에 같은 열 타입·필터·집계식을 사용해야 한다. 변환과 정렬에도 시간이 들므로 한 번의 조회인지, 이후 여러 번 읽을 데이터인지에 따라 선택이 달라진다.

반복 조인이라면 DuckDB 테이블도 비교한다

Parquet을 직접 읽는 방식이 모든 분석의 종착점은 아니다. DuckDB 성능 가이드는 조인이 많거나 같은 데이터를 여러 번 질의한다면 데이터베이스에 적재하는 방법을 권한다. DuckDB 자체 형식의 더 풍부한 통계는 조인 순서 선택에 도움이 된다.

작업우선 비교할 선택이유
작은 파일을 열어 수정하거나 전달한다.CSV텍스트로 확인하기 쉽고 기존 도구와 주고받기 편하다.
큰 파일의 일부 열·기간을 집계한다.Parquet 직접 질의필요 없는 열과 조건 밖 행 그룹의 읽기를 줄일 수 있다.
같은 데이터를 반복해서 조인한다.DuckDB 테이블 적재조인 최적화용 통계와 반복 질의의 이점을 활용한다.

CSV를 무조건 바꾸기보다 자주 실행하는 쿼리부터 고르는 편이 낫다. 필요한 열과 날짜를 좁혀 읽는다면 Parquet의 이점을 시험하고, 반복 조인이 중심이면 적재 시간과 저장 공간까지 포함해 DuckDB 테이블과 비교한다.