- 희소 프라이머리 인덱스 - 선택한 키를 기준으로 디스크에 데이터를 정렬하므로, ClickHouse가 쿼리 중 관련 없는 대규모 행 범위를 건너뛸 수 있습니다.
- 향상된 데이터 타입 - JSON, LowCardinality, Enum과 같은 타입을 네이티브로 지원하여 더 압축된 저장과 더 빠른 처리를 가능하게 합니다.
- Skip indices 및 full-text indices - 쿼리의 필터 프레디케이트와 일치하지 않는 그래뉼을 ClickHouse가 건너뛸 수 있게 해 주는 세컨더리 인덱스 구조로, 특히 텍스트 검색 워크로드에서 효과적입니다.
- 자동 compaction을 지원하는 빠른 삽입 - ClickHouse는 높은 처리량의 삽입을 위해 설계되었으며, 오픈 테이블 포맷의 compaction과 유사하게 백그라운드에서 데이터 파트를 자동으로 머지합니다.
- 동시 읽기에 최적화 - MergeTree의 열 지향 저장 레이아웃은 여러 캐싱 계층과 결합되어 높은 동시성의 실시간 분석 워크로드를 지원합니다. 이는 오픈 테이블 포맷이 본래 고려한 설계 목적이 아닙니다.
INSERT INTO SELECT를 사용해 카탈로그의 데이터를 MergeTree 테이블로 로드하는 방법을 설명합니다.
카탈로그에 연결하기
테이블 목록 확인
스키마 탐색
데이터 레이크 테이블 쿌리하기
logger_name 같은 컬럼은 카디널리티가 너무 높아 효과적인 파티셔닝이 어려울 수 있습니다. 또한 데이터를 더 줄여서 읽기 위해 텍스트 인덱스 같은 인덱스도 없습니다. 바로 이런 경우에 MergeTree가 강점을 발휘합니다.
MergeTree에 데이터 적재
최적화된 테이블 만들기
Nullable래퍼를 사용하지 않음 -Nullable을 제거하면 저장 효율성과 쿼리 성능이 향상됩니다.level,instance_type,thread_name,check_name컬럼의LowCardinality(String)- 고유값이 적은 컬럼을 딕셔너리 인코딩하여 압축 효율을 높이고 필터링을 더 빠르게 수행합니다.message컬럼의 전문 검색 인덱스 -hasToken(message, 'error')와 같은 토큰 기반 텍스트 검색을 가속화합니다.(instance_type, thread_name, toStartOfMinute(event_time))로 지정한ORDER BY키 - 자주 사용하는 필터 패턴에 맞춰 디스크에 데이터를 정렬하므로 희소 프라이머리 인덱스가 관련 없는 그래뉼을 건너뛸 수 있습니다.
카탈로그에서 데이터 삽입
INSERT INTO SELECT를 사용하여 데이터 레이크 테이블에 있는 약 3억 건의 데이터를 ClickHouse 테이블에 적재합니다:
쿼리 다시 실행하기
- 희소 프라이머리 인덱스 -
ORDER BY (instance_type, thread_name, ...)키 덕분에 ClickHouse는instance_type = 'm6i.4xlarge'및thread_name = 'TCPHandler'와 일치하는 그래뉼로 바로 건너뛸 수 있어, 처리해야 하는 행 수를 2억 8,300만 개에서 1,400만 개로 줄일 수 있습니다. - 전문 검색 인덱스 -
message컬럼의text_idx인덱스를 사용하면hasToken(message, 'error')를 모든 메시지 문자열을 스캔하지 않고 인덱스를 통해 처리할 수 있으므로, ClickHouse가 읽어야 하는 데이터가 더욱 줄어듭니다.