Column-oriented(Columnar) 저장 방식

데이터베이스에 데이터를 저장할 때, 보통 대부분은 row-oriented 방식으로 저장한다. 처음에 데이터베이스를 공부할 때 row-oriented 방식으로 배웠기 때문에 자연스럽게 이를 떠올린다. 그래서 column-oriented 방식으로 저장하는 것에 대해서 크게 와닿지 않았다. 기본적으로 우리는 데이터라는 것을 떠올릴 때, 여러 가지의 컬럼을 가진 하나의 로우를 떠올린다. 그래서 더 row-oriented 방식이 와닿는지는 모른다.

What is Column-oriented?

행 기반(row-oriented) 저장 방식을 보면 데이터는 하나의 행이 가진 모든 열에 대한 데이터를 저장한다. 행이 가진 모든 열에 대한 데이터를 저장하고 그 이후에 또 다른 행이 가진 모든 열에 데이터를 저장한다. 그러나 열 기반(column-oriented) 저장 방식은 하나의 열에 대해서 모든 행이 가진 데이터를 저장한다. 그 이후 다른 열에 대한 데이터를 저장한다. 

Why Column-oriented Need?

열 기반 저장 방식이 왜 필요할까. 그거는 저장 방식이 다름에 따라 서로 장단점이 있기 때문이다. 행 기반의 저장 방식이 가진 장단점과 열 기반의 저장 방식이 가진 장단점이 있다. 이 두 개의 저장 방식은 트레이드 오프 관계라서 요구사항에 따라 적절한 것을 선택한다. 두 방식이 가진 장단점은 위키 페이지를 읽어보기를 바란다.

열 기반의 저장 방식에 대해서도 검색해보면 거의 대부분의 블로그가 위의 위키 페이지의 정보를 거의 그대로 풀어쓴 얘기다. 나는 왜 이러한 장단점이 있는지 궁금했지만 도움이 되는 글은 별로 없었다. 데이터 접근 및 데이터 압축에 관련해서는 그래도 설명이 있어서 이해가 갔지만 정작 연산 관련해서 열 기반이 저장 방식이 왜 빠른지는 이해하지 못했다. 대부분은 그냥 빠르다라고만 써져 있기 때문이다. 그래도 조금 더 찾아보면 SIMD 연산 작업때문에 열 기반의 저장 방식이 분석 용도의 요구 사항을 더 빠르게 처리할 수 있다고 한다. 그렇다면 SIMD는 무엇일까. 

SIMD는 하나의 명령어로 다수의 데이터를 처리하는 방법을 말한다. 이 블로그 글을 보면 설명이 잘되어 있다. 그렇다면 왜 열 기반의 저장 방식에서 SIMD 방법을 사용할 수 있을까. 그 이유는 하나의 열은 동일한 자료형을 가지고 있기 때문이다. 이 부분이 더 궁금하지만, 현재는 동일한 자료형을 가진 데이터를 처리할 때 SIMD 연산을 사용할 수 있음으로 알고 넘어가려고 한다.

Referneces