Medium에 작성했던 Columnar database와 Row-oriented database를 블로그로 옮겨 정리한 글이다.
데이터베이스는 데이터를 어떤 단위로 저장하느냐에 따라 읽기와 쓰기 성능 특성이 달라진다. 대표적인 저장 방식으로는 행 기반 저장 방식과 열 기반 저장 방식이 있다.
일반적인 OLTP 시스템에서는 행 기반 데이터베이스를 많이 사용하고, 대량 분석이나 집계에는 열 기반 데이터베이스가 자주 사용된다.
Row-oriented Database
Row-oriented Database는 데이터를 행 단위로 저장한다. 하나의 레코드에 속한 여러 컬럼 값이 함께 저장되는 방식이다.
예를 들어 회원 테이블에 id, name, age, email 컬럼이 있다면 한 회원의 값들이 하나의 행으로 묶여 저장된다. 특정 회원 한 명의 전체 정보를 읽거나 수정하는 작업에 적합하다.
서비스에서 자주 발생하는 회원 가입, 주문 생성, 게시글 수정 같은 작업은 보통 하나의 레코드 단위로 읽고 쓰는 경우가 많다. 그래서 트랜잭션 중심의 애플리케이션에서는 행 기반 저장 방식이 자연스럽다.
Columnar Database
Columnar Database는 데이터를 열 단위로 저장한다. 같은 컬럼의 값들이 물리적으로 가까운 위치에 모이기 때문에, 특정 컬럼만 대량으로 읽는 작업에 유리하다.
예를 들어 매출 테이블에서 amount 컬럼만 모아 합계를 계산하거나, created_at 기준으로 기간별 집계를 수행하는 경우를 생각할 수 있다. 전체 행의 모든 컬럼을 읽을 필요 없이 필요한 컬럼만 읽으면 되므로 분석 쿼리에서 효율적이다.
또한 같은 컬럼에는 비슷한 형태의 데이터가 반복되는 경우가 많아 압축 효율도 좋아질 수 있다. 이 특성 때문에 데이터 웨어하우스나 분석 시스템에서 열 기반 저장 방식이 많이 사용된다.
저장 방식의 차이
행 기반 저장 방식은 레코드 전체를 함께 다룬다. 하나의 행에 포함된 여러 컬럼을 동시에 읽고 쓰는 작업에 강하다.
반면 열 기반 저장 방식은 컬럼별로 데이터를 모아둔다. 많은 행을 대상으로 일부 컬럼만 읽어 집계하거나 분석할 때 강하다.

간단히 말하면 다음처럼 나눠볼 수 있다.
- Row-oriented Database는 레코드 단위 작업에 적합하다.
- Columnar Database는 컬럼 단위 분석에 적합하다.
- OLTP 성격의 서비스 요청은 보통 행 기반 저장과 잘 맞는다.
- OLAP 성격의 분석 쿼리는 보통 열 기반 저장과 잘 맞는다.
공간 효율과 스키마
열 기반 저장 방식은 같은 컬럼의 값들이 모여 있어 압축에 유리하다. 비슷한 데이터 타입과 반복되는 값이 많을수록 저장 공간을 줄이기 좋다.
행 기반 저장 방식은 고정된 스키마와 레코드 구조를 기반으로 동작하기 때문에 예측 가능한 레코드 저장에 유리하다. 반대로 읽지 않는 컬럼까지 함께 접근하는 경우에는 분석 쿼리에서 불필요한 I/O가 늘어날 수 있다.
정리
Row-oriented Database와 Columnar Database는 어느 한쪽이 항상 더 좋은 관계가 아니다. 어떤 작업을 자주 수행하는지에 따라 적합한 저장 방식이 달라진다.
서비스의 핵심 트랜잭션처럼 한 레코드의 여러 값을 함께 읽고 쓴다면 행 기반 저장 방식이 잘 맞는다. 반대로 많은 데이터를 훑으면서 특정 컬럼만 집계하거나 분석한다면 열 기반 저장 방식이 더 적합하다.