ClickHouse는 Columnar DBMS이다.
간단하게 mergetree 테이블을 생성해서 데이터를 넣으면 다음과 같이 데이터 파일이 생성된다.

Columnar DBMS인데... data.bin 하나로 뭉뚱그려서 저장이 된다.
이렇게 하나의 데이터 파트가 data.bin으로 저장되는 유형을 "Compact" 유형이라 한다.
데이터가 작을때는 컬럼별로 데이터 파일을 생성하지 않고 하나의 데이터 파일로 관리하다가
데이터가 많아지면 컬럼별로 데이터 파일을 생성해 관리한다. 이때 데이터 파트 유형을 "Wide" 유형이라 한다.
다음의 쿼리를 통해 테이블의 데이터 파트 유형을 확인할 수 있다.
SELECT
name,
rows,
formatReadableSize(bytes_on_disk) AS bytes_on_disk,
part_type
FROM system.parts
WHERE (database = 'gwchu') AND (`table` = 't_sample') AND active
ORDER BY modification_time DESC
LIMIT 5
┌─name──────┬─rows─┬─bytes_on_disk─┬─part_type─┐
1. │ all_2_2_0 │ 9000 │ 76.37 KiB │ Compact │
2. │ all_1_1_0 │ 4 │ 760.00 B │ Compact │
└───────────┴──────┴───────────────┴───────────┘
데이터 파일을 컬럼별로 저장하도록 변경하는 방법은 두가지가 있다.
1. 데이터를 많이 넣기
2. 관련 설정 변경
해당 테이블 파트 설정은 기본적으로 system.merge_tree_settings에서 확인할 수 있다.
시스템 설정 변경은 불가능하고. 개별 테이블 설정은 변경이 가능하다.
SELECT
name,
value
FROM system.merge_tree_settings
WHERE name LIKE '%min_%_for_wide_part%'
┌─name────────────────────┬─value────┐
1. │ min_bytes_for_wide_part │ 10485760 │
2. │ min_level_for_wide_part │ 0 │
3. │ min_rows_for_wide_part │ 0 │
└─────────────────────────┴──────────┘
위의 시스템 설정을 참고했을때, 10MB정도 데이터가 들어가야 Wide 타입으로 바뀌는 것을 확인할 수 있다.
테이블 개별 설정을 0으로 변경하여 바로 wide로 변경해보았다.
ALTER TABLE gwchu.t_sample
(MODIFY SETTING min_rows_for_wide_part = 0, min_bytes_for_wide_part = 0)
OPTIMIZE TABLE gwchu.t_sample FINAL
SELECT
name,
rows,
formatReadableSize(bytes_on_disk) AS bytes_on_disk,
part_type
FROM system.parts
WHERE (database = 'gwchu') AND (`table` = 't_sample')
ORDER BY modification_time DESC
LIMIT 5
┌─name──────┬─rows─┬─bytes_on_disk─┬─part_type─┐
1. │ all_1_2_2 │ 9004 │ 76.76 KiB │ Wide │
2. │ all_1_2_1 │ 9004 │ 76.43 KiB │ Compact │
3. │ all_2_2_0 │ 9000 │ 76.37 KiB │ Compact │
4. │ all_1_1_0 │ 4 │ 760.00 B │ Compact │
└───────────┴──────┴───────────────┴───────────┘

컬럼별로 데이터 파일이 생성된 것을 볼 수 있다.
실제 데이터는 {컬럼명}.bin에 압축해서 저장이 된다.
bin 파일 안에는 데이터가 granule(데이터 블록)단위로 묶여서 저장된다. (기본 8192 rows)
{컬럼명}.cmrk2 파일은 bin파일에 저장되어 있는 granule 위치(offset)를 찾아가기 위한 인덱스이다.
참고로, cmrk2와 cmrk4는 mark 포맷의 버전 차이라고 한다.
[참고자료]
https://westlife0615.tistory.com/598
https://clickhouse.com/docs/operations/system-tables/parts

'Database > ClickHouse' 카테고리의 다른 글
| ClickHouse 설치 (0) | 2019.10.11 |
|---|