TT Lab

ClickHouse · 열로 저장한다는 것

같은 질의, 다른 디스크 읽기

행 저장은 한 행의 모든 열을 페이지 하나에 붙여 둡니다. 그래서 한 열만 필요해도 페이지째 읽고, 다른 열이 모두 딸려 옵니다. 열 저장은 열마다 파일을 따로 두어 필요한 열만 읽습니다. 그런데 한 행 전체가 필요할 때는 거꾸로 됩니다 — 열 저장은 그 한 행을 모으려고 열마다 8192 행짜리 그래뉼을 하나씩 읽어야 합니다. 어느 쪽이 빠른지는 저장 방식이 아니라 질의가 정합니다.

같은 표를 두 가지로 자른 판 두 장

왼쪽이 행 저장(모든 열을 가로질러 페이지로 자름), 오른쪽이 열 저장(열마다 그래뉼로 자름)입니다. 열의 폭은 값 하나의 바이트, 앞뒤 길이는 행 수, 두께는 압축 뒤의 크기입니다 · 읽었고 질의가 쓰는 것 · 읽었지만 딸려 온 것 · 읽지 않은 것. 한 행 조회에서는 떠오른 조각만 확대해 보입니다(페이지와 그래뉼은 같은 비율로).

질의와 표 크기 바꿔 보기

디스크에서 읽는 양

질의
행 저장
열 저장
견주면
질의가 정말 쓰는 양
열마다 읽는 양 — 행 저장은 필요 없는 열도 페이지와 함께 딸려 온다
열타입값 하나 행 저장이 읽는 양열 저장이 읽는 양
질의마다 어느 쪽이 적게 읽는가 — 지금 고른 행 수 기준
질의행 저장 열 저장견주면

행 저장은 8 KiB 페이지와 id 의 B-트리 인덱스를, 열 저장은 8192 행 그래뉼과 메모리에 올라온 성긴 기본 키를 가정했습니다. 헤더와 마크 파일은 뺐고, 압축률은 실측이 아닌 예시 값입니다. 같은 값이 되풀이되는 열(국가·기기·상태 코드)이 한데 모이면 훨씬 잘 줄어듭니다 — 압축을 켜면 모든 열을 다 읽을 때도 열 저장이 앞서는 이유입니다.