한양과학기술고등학교

에듀테크 프로젝트 대시보드

컬럼 지향 스토리지 — Row-oriented vs Column-oriented

표 하나, 저장하는 두 가지 방법

데이터베이스 테이블은 논리적으로는 행과 열이 있는 표처럼 보이지만, 디스크에는 결국 한 줄로 이어진 바이트 나열로 저장된다. 이때 어떤 순서로 나열하느냐에 따라 같은 표라도 완전히 다른 물리적 파일이 된다. 아래 학생 8명 표를 예로 들어보자.

idnameage deptscorecity
1김민준17이과92서울
2이서연16문과88부산
3박도윤17이과95서울
4최지우16이과79대구
5정하은17문과84서울
6강시우16이과91부산
7윤아린17문과87대구
8임태현16이과93서울

로우 지향(Row-oriented): 행 단위로 이어 붙인다

id₁·name₁·age₁·dept₁·score₁·city₁, id₂·name₂·age₂·… 순서로, 한 학생의 모든 값이 연속으로 저장된다. 일반적인 RDBMS(MySQL, PostgreSQL 등)의 기본 저장 방식이며, "행 하나 통째로 읽고/쓰기"에 최적화돼 있다.

컬럼 지향(Column-oriented): 열 단위로 이어 붙인다

id₁·id₂·…·id₈, name₁·name₂·…·name₈, age₁·age₂·… 순서로, 같은 컬럼의 값들이 연속으로 저장된다. Parquet, ClickHouse, BigQuery 같은 분석용(OLAP) 엔진이 즐겨 쓰는 방식이다.

직접 돌려보기 — 컬럼 하나만 조회하면?

"이 학생들의 평균 점수(score)는?" 같은 분석 쿼리는 표에서 딱 한 컬럼만 있으면 된다. 컬럼을 골라 실행 버튼을 누르면, 두 저장 방식이 디스크에서 실제로 읽어야 하는 블록이 얼마나 다른지 애니메이션으로 비교할 수 있다.

조회할 컬럼:

Row-Oriented

읽은 블록: 0 / 48

Column-Oriented

읽은 블록: 0 / 48
컬럼을 고르고 실행 버튼을 눌러보세요.

압축까지 유리하다 — Run-Length Encoding

같은 컬럼의 값이 연속으로 붙어 있으면, 반복되는 값을 "값 + 반복 횟수" 쌍으로 줄이는 런-길이 인코딩(RLE) 같은 압축이 매우 잘 먹힌다. 위 표를 dept 기준으로 정렬하면 이과,이과,이과,이과,이과,문과,문과,문과 처럼 같은 값이 뭉치는데, 로우 지향 저장에서는 dept 값들이 다른 컬럼 값들 사이에 흩어져 있어 이런 압축을 적용하기 어렵다.

원본 (정렬된 dept 컬럼, 8칸):

원본 8칸 → 압축 전, 실행 버튼을 눌러보세요.

어느 쪽을 써야 할까?

Row-Oriented (행 지향)Column-Oriented (컬럼 지향)
회원가입, 주문 생성처럼 레코드 하나를 통째로 읽고 쓰는 OLTP(온라인 거래 처리)에 유리. "이번 달 평균 매출은?" 처럼 수백만 행 중 일부 컬럼만 집계하는 OLAP(분석)에 유리.
행 하나가 디스크의 한 블록 근처에 모여 있어 INSERT/UPDATE가 빠르다. 같은 타입의 값이 모여 있어 압축률이 높고, 필요 없는 컬럼은 아예 읽지 않는다.
예: MySQL, PostgreSQL(기본 힙 테이블), MongoDB. 예: Parquet/ORC 파일, ClickHouse, Amazon Redshift, Google BigQuery.

관련 주제: 데이터베이스 인덱스 · 정규화 · SQL 조인 · LSM 트리 · 허프만 코딩