프로젝션 개요
- 프라이머리 키(primary key)에 포함되지 않은 컬럼에서 쿼리를 실행할 때
- 컬럼을 사전 집계해 계산량과 IO를 모두 줄일 때
디스크 사용량프로젝션은 내부적으로 새로운 숨겨진 테이블을 생성하므로 더 많은 IO와 디스크 공간이 필요합니다.
예를 들어 프로젝션에 다른 프라이머리 키가 정의되어 있으면 원본 테이블의 모든 데이터가 복제됩니다.
프로젝션 사용
프라이머리 키를 사용하지 않고 필터링하는 예시
ALTER TABLE을 사용하면 기존 테이블(table)에 Projection을 추가할 수 있습니다:
user_name이 PRIMARY_KEY로 정의되지 않았더라도 user_name으로 빠르게 필터링할 수 있습니다.
쿼리 시점에 ClickHouse는 데이터가 user_name 순으로 정렬되어 있으므로 프로젝션을 사용하는 편이 처리해야 할 데이터가 더 적다고 판단합니다.
system.query_log 테이블을 살펴볼 수 있습니다. projections 필드에는 사용된 프로젝션의 이름이 표시되며, 사용되지 않았다면 비어 있습니다:
예시 사전 집계 쿼리
projection_visits_by_user가 포함된 테이블을 생성합니다:
GROUP BY를 사용해 user_agent 필드로 첫 번째 쿼리를 실행합니다.
사전 집계 조건이 일치하지 않으므로 이 쿼리에서는 정의된 프로젝션을 사용하지 않습니다.
GROUP BY 필드의 일부 또는 전체를 선택하는 쿼리를 실행하면 됩니다:
system.query_log 테이블을 검토할 수 있습니다.
projections 필드는 사용된 프로젝션의 이름을 보여줍니다.
프로젝션이 사용되지 않은 경우 이 필드는 비어 있습니다:
프로젝션 인덱스 생성 및 사용
_part_offset 필드는 머지와 뮤테이션 이후에도 값이 유지되므로 보조 인덱스에 유용합니다. 이를 쿼리에서 활용할 수 있습니다:
프로젝션 관리
ADD PROJECTION
WITH SETTINGS 절
WITH SETTINGS는 프로젝션 수준 설정을 정의하며, 이를 통해 프로젝션이 데이터를 저장하는 방식을 조정할 수 있습니다(예: index_granularity, index_granularity_bytes).
이 설정은 MergeTree 테이블 설정과 직접 대응되지만, 이 프로젝션에만 적용됩니다.
예시:
DROP PROJECTION
MATERIALIZE PROJECTION
partition_name의 프로젝션 name을 재구성합니다.
이 작업은 뮤테이션으로 수행됩니다.
CLEAR PROJECTION
ADD, DROP, CLEAR 명령은 메타데이터만 변경하거나 파일만 제거하므로 경량입니다.
또한 이러한 명령은 복제되며, ClickHouse Keeper 또는 ZooKeeper를 통해 프로젝션 메타데이터를 동기화합니다.
프로젝션 조작은
*MergeTree 엔진을 사용하는 테이블(복제된 변형 포함)에서만 지원됩니다.프로젝션 머지 동작 제어
ReplacingMergeTree 테이블 엔진을 사용한다고 가정해 보겠습니다.
머지 중 여러 입력 파트에서 동일한 행이 발견되면 가장 최신 행 버전(가장 최근에 삽입된 파트의 행)만 유지되고, 이전 버전은 모두 삭제됩니다.
마찬가지로 테이블이 AggregatingMergeTree 테이블 엔진을 사용하는 경우, 머지 작업은 입력 파트의 동일한 행을(기본 키 값을 기준으로) 하나의 행으로 합쳐 부분 집계 상태를 갱신할 수 있습니다.
ClickHouse v24.8 이전에는 프로젝션 파트가 메인 데이터와 조용히 불일치 상태가 되거나, 테이블에 프로젝션이 있으면 데이터베이스가 자동으로 예외를 발생시켰기 때문에 업데이트 및 삭제와 같은 특정 작업을 아예 실행할 수 없었습니다.
v24.8부터는 새로운 테이블 수준 설정 deduplicate_merge_projection_mode으로 앞서 설명한 비단순한 백그라운드 머지 작업이 원본 테이블의 파트에서 발생할 때의 동작을 제어할 수 있습니다.
삭제 뮤테이션도 원본 테이블의 파트에서 행을 제거하는 파트 병합 작업의 또 다른 예입니다. v24.7부터는 경량한 삭제에 의해 트리거된 삭제 뮤테이션의 동작을 제어하는 설정 lightweight_mutation_projection_mode도 제공됩니다.
아래는 deduplicate_merge_projection_mode와 lightweight_mutation_projection_mode에 사용할 수 있는 값입니다:
throw(기본값): 예외를 발생시켜 프로젝션 파트가 원본 데이터와 불일치 상태가 되는 것을 방지합니다.drop: 영향을 받는 프로젝션 테이블 파트가 삭제됩니다. 해당 프로젝션 파트에 대한 쿼리는 원본 테이블 파트로 대체됩니다.rebuild: 영향을 받은 프로젝션 파트를 다시 빌드하여 원본 테이블 파트의 데이터와 일관성을 유지합니다.
제한 사항
ORDER BY 절에서는 ALIAS 컬럼을 사용할 수 없습니다. 예시는 다음과 같습니다.
ALIAS 컬럼은 물리적으로 저장되지 않고 쿼리 시점에 즉시 계산되므로, 정렬 표현식을 평가하는 projection part 쓰기 경로에서는 사용할 수 없습니다.
대신 MATERIALIZED 컬럼을 사용하거나 표현식을 직접 인라인으로 작성하십시오: