스토리지 계층: 동시 삽입은 서로 격리됩니다
스토리지 계층: 동시 삽입과 SELECT는 서로 격리됩니다
스토리지 계층: 머지 시점 계산
- Replacing 머지는 입력 파트에 있는 행 버전 중 가장 최신 버전만 유지하고 나머지 모든 행 버전은 삭제합니다. Replacing 머지는 머지 시점의 정리 작업으로 볼 수 있습니다.
- 집계 머지는 입력 파트의 중간 집계 상태를 새로운 집계 상태로 결합합니다. 다소 이해하기 어렵게 들릴 수 있지만, 실제로는 증분 집계를 구현한 것에 불과합니다.
- TTL (time-to-live) 머지는 특정 시간 기반 규칙에 따라 행을 압축하거나 이동하거나 삭제합니다.
스토리지 계층: 데이터 프루닝
- 테이블 데이터의 정렬 순서를 정의하는 기본 키(Primary Key) 인덱스입니다. 기본 키를 적절히 선택하면 전체 컬럼 스캔 대신 빠른 이진 검색으로 필터를 평가할 수 있습니다(예: 위 쿼리의 WHERE 절). 좀 더 기술적으로 말하면, 스캔의 런타임은 데이터 크기에 대해 선형이 아니라 로그 규모로 증가합니다.
- 동일한 데이터를 저장하지만 다른 기본 키로 정렬된 테이블의 대안적 내부 버전인 테이블 프로젝션입니다. 프로젝션은 자주 사용하는 필터 조건이 둘 이상일 때 유용할 수 있습니다.
- 최소값과 최대값, 고유값 집합 등 추가적인 데이터 통계를 컬럼에 포함하는 스키핑 인덱스입니다. 스키핑 인덱스는 기본 키 및 테이블 프로젝션과 독립적으로 사용할 수 있으며, 컬럼의 데이터 분포에 따라 필터 평가 속도를 크게 높일 수 있습니다.
스토리지 계층: 데이터 압축
최첨단 쿼리 처리 레이어
디테일까지 집요하게 챙기기
“ClickHouse는 정말 괴짜 같은 시스템입니다. 해시 테이블만 해도 20가지 버전이 있습니다. 대부분의 시스템에는 해시 테이블이 하나뿐인데, 여기는 이런 놀라운 것들이 가득합니다 … ClickHouse가 이렇게 놀라운 성능을 내는 이유는 이런 특화된 구성 요소를 모두 갖추고 있기 때문입니다” Andy Pavlo, CMU 데이터베이스 교수ClickHouse를 돋보이게 하는 점은 저수준 최적화까지 파고드는 치밀함입니다. 그저 동작하는 데이터베이스를 만드는 것과, 다양한 쿼리 유형, 데이터 구조, 배포판, 인덱스 구성 전반에서 빠르게 동작하도록 설계하는 것은 전혀 다른 일입니다. 바로 이 지점에서 “괴짜 같은 시스템”의 진가가 드러납니다. 해시 테이블. 해시 테이블을 예로 들어 보겠습니다. 해시 테이블은 조인과 집계에 핵심적으로 사용되는 데이터 구조입니다. 프로그래머는 다음과 같은 설계 결정을 고려해야 합니다:
- 어떤 해시 함수를 선택할지,
- 충돌 해결 방식은 오픈 어드레싱으로 할지, 아니면 체이닝으로 할지,
- 메모리 레이아웃은 키와 값을 하나의 배열에 둘지, 아니면 별도의 배열에 둘지?
- 채움 비율은 어떻게 할지: 언제, 어떤 방식으로 크기를 조정할지? 크기 조정 시 값은 어떻게 옮길지?
- 삭제: 해시 테이블이 항목 제거를 허용해야 할지?
- 무엇을 정렬할 것인가: 숫자, 튜플, 문자열, 아니면 구조체인가?
- 데이터가 RAM에 있는가?
- 정렬이 반드시 안정적이어야 하는가?
- 모든 데이터를 정렬해야 하는가, 아니면 부분 정렬로 충분한가?