에듀테크 프로젝트 대시보드
컬럼 지향 스토리지 — Row-oriented vs Column-oriented
데이터베이스 테이블은 논리적으로는 행과 열이 있는 표처럼 보이지만, 디스크에는 결국 한 줄로 이어진 바이트 나열로 저장된다. 이때 어떤 순서로 나열하느냐에 따라 같은 표라도 완전히 다른 물리적 파일이 된다. 아래 학생 8명 표를 예로 들어보자.
| id | name | age | dept | score | city |
|---|---|---|---|---|---|
| 1 | 김민준 | 17 | 이과 | 92 | 서울 |
| 2 | 이서연 | 16 | 문과 | 88 | 부산 |
| 3 | 박도윤 | 17 | 이과 | 95 | 서울 |
| 4 | 최지우 | 16 | 이과 | 79 | 대구 |
| 5 | 정하은 | 17 | 문과 | 84 | 서울 |
| 6 | 강시우 | 16 | 이과 | 91 | 부산 |
| 7 | 윤아린 | 17 | 문과 | 87 | 대구 |
| 8 | 임태현 | 16 | 이과 | 93 | 서울 |
id₁·name₁·age₁·dept₁·score₁·city₁, id₂·name₂·age₂·… 순서로, 한 학생의 모든 값이 연속으로 저장된다. 일반적인 RDBMS(MySQL, PostgreSQL 등)의 기본 저장 방식이며, "행 하나 통째로 읽고/쓰기"에 최적화돼 있다.
id₁·id₂·…·id₈, name₁·name₂·…·name₈, age₁·age₂·… 순서로, 같은 컬럼의 값들이 연속으로 저장된다. Parquet, ClickHouse, BigQuery 같은 분석용(OLAP) 엔진이 즐겨 쓰는 방식이다.
"이 학생들의 평균 점수(score)는?" 같은 분석 쿼리는 표에서 딱 한 컬럼만 있으면 된다. 컬럼을 골라 실행 버튼을 누르면, 두 저장 방식이 디스크에서 실제로 읽어야 하는 블록이 얼마나 다른지 애니메이션으로 비교할 수 있다.
같은 컬럼의 값이 연속으로 붙어 있으면, 반복되는 값을 "값 + 반복 횟수" 쌍으로 줄이는
런-길이 인코딩(RLE) 같은 압축이 매우 잘 먹힌다. 위 표를 dept 기준으로 정렬하면
이과,이과,이과,이과,이과,문과,문과,문과 처럼 같은 값이 뭉치는데, 로우 지향
저장에서는 dept 값들이 다른 컬럼 값들 사이에 흩어져 있어 이런 압축을 적용하기 어렵다.
원본 (정렬된 dept 컬럼, 8칸):
압축 결과:
| Row-Oriented (행 지향) | Column-Oriented (컬럼 지향) |
|---|---|
| 회원가입, 주문 생성처럼 레코드 하나를 통째로 읽고 쓰는 OLTP(온라인 거래 처리)에 유리. | "이번 달 평균 매출은?" 처럼 수백만 행 중 일부 컬럼만 집계하는 OLAP(분석)에 유리. |
| 행 하나가 디스크의 한 블록 근처에 모여 있어 INSERT/UPDATE가 빠르다. | 같은 타입의 값이 모여 있어 압축률이 높고, 필요 없는 컬럼은 아예 읽지 않는다. |
| 예: MySQL, PostgreSQL(기본 힙 테이블), MongoDB. | 예: Parquet/ORC 파일, ClickHouse, Amazon Redshift, Google BigQuery. |
관련 주제: 데이터베이스 인덱스 · 정규화 · SQL 조인 · LSM 트리 · 허프만 코딩