데이터베이스를 예시로 들면, 행 기반으로 저장하는 방식(대표적으로 MySQL)과 열 기반(대표적으로 BigQuery)으로 저장하는 방식이 있다.
다음과 같은 데이터베이스가 있다고 했을때

행 기반

열 기반

열 기반으로 저장되는 것이 압축률이 더 좋은 이유는 다음과 같이 설명할 수 있다.
같은 컬럼에는 종종 유사한 데이터가 나열된다. 특히 같은 문자열의 반복은 매우 작게 압축할 수 있다. 데이터의 종류에 따라 다르지만, 열 지향 데이터베이스는 압축되지 않은 행 지향 데이터 베이스와 비교하면 1/10 이하로 압축 가능하다.
데이터 분석에서는 종종 일부 칼럼만이 집계 대상이기 때문에, 이렇게 열 기반으로 압축하면 필요한 칼럼만을 빠르게 읽고 집계할 수 있다.
그렇다면 열 기반으로만 저장하는게 좋은 거 아닌가?
위와 같은 궁금증이 들 수 있는데 MySQL 의 경우 대표적인 행 기반 저장 방식의 데이터베이스이다.
행 기반 데이터베이스는 매일 발생하는 대량의 트랜잭션을 지연 없이 처리하기 위해 데이터 추가를 효율적으로 할 수 있도록 하는 것이 행 지향 데이터베이스의 특징이다.
새로운 레코드를 추가할 경우 끝부분에 추가되기 때문에 고속으로 쓰기가 가능하다.
위에서 설명한대로 칼럼단위로 압축하기 압축률이 좋다.
디스크 IO 가 적다. 데이터를 미리 칼럼 단위로 정리해 둠으로써 필요한 칼럼만을 로드하기 때문


각 블록은 row group을 저장
row group은, row에 대한 column chunk로 되어 있다.
각 column chunk의 데이터는 페이지에 기록된다.
각 페이지는 동일한 column의 값만 포함하고 있다.
따라서 페이지의 있는 값은 비슷한 결향이 있기 때문에 페이지를 압축할 때 유리하다.
row group과 column chunk
예시 테이블
ID Name Age Country 1 Alice 30 USA 2 Bob 25 Canada 3 Charlie 35 UK 4 David 28 Australia 5 Eve 40 Germany
- row group 1:
레코드: (ID=1, Name=Alice, Age=30, Country=USA), (ID=2, Name=Bob, Age=25,Country=Canada), (ID=3, Name=Charlie, Age=35, Country=UK)
row group 1:
Column Chunk 1 (ID 컬럼):
데이터: [1, 2, 3, 4, 5]Column Chunk 2 (Name 컬럼):
데이터: [Alice, Bob, Charlie, David, Eve]Column Chunk 3 (Age 컬럼):
데이터: [30, 25, 35, 28, 40]Column Chunk 4 (Country 컬럼):
데이터: [USA, Canada, UK, Australia, Germany]