ALTER TABLE ... INDEX
ALTER TABLE ... INDEX (skipping index)
다음 연산들을 사용할 수 있어요.
출처: 문서
본문
ADD INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] ADD INDEX [IF NOT EXISTS] name expression TYPE type [GRANULARITY value] [FIRST|AFTER name] - 테이블 메타데이터에 인덱스 설명을 추가해요.
DROP INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] DROP INDEX [IF EXISTS] name - 테이블 메타데이터에서 인덱스 설명을 제거하고 디스크에서 인덱스 파일을 삭제해요. mutation으로 구현됩니다.
MATERIALIZE INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] MATERIALIZE INDEX [IF EXISTS] name [IN PARTITION partition_name] - 지정된 partition_name에 대해 보조 인덱스 name을 다시 빌드해요. mutation으로 구현됩니다. IN PARTITION 부분이 생략되면 전체 테이블 데이터에 대해 인덱스를 다시 빌드합니다.
MATERIALIZE COLUMN은 MATERIALIZE INDEX의 완전한 대체가 아니에요. wide + full-storage인 파트에서는 standalone 스킵 인덱스(또는 텍스트 인덱스) 파일을 새로 고치지 않고 컬럼 값을 다시 쓸 수 있어요. skp_idx.packed에 저장된 일반적인 스킵 인덱스는 예외인데요, wide + full-storage 파트에서도 강제로 다시 계산될 수 있기 때문이에요(기본 packed_skip_index_max_bytes 아래의 작은 스킵 인덱스 서브스트림; 전체 텍스트 인덱스는 이렇게 패킹되지 않아요). wide + full-storage가 아닌 파트(compact + full, compact + packed, wide + packed 포함)에서는 전체 파트 재작성이 기존 인덱스를 다시 계산할 수 있어요 — 작은 파트는 기본적으로 full 파트 스토리지를 사용하면서도 흔히 compact인 경우가 많아요. 이미 데이터가 있는 테이블에 인덱스를 추가했을 때(메타데이터만 변경하는 ADD INDEX)와, wide + full-storage 파트에서 컬럼이 다시 쓰여진 후 standalone 인덱스 파일을 즉시 다시 빌드해야 할 때는 결정적/즉시 경로인 MATERIALIZE INDEX를 사용하세요. 과거 파트의 새로 추가된 인덱스(텍스트 인덱스 포함)는 materialize_skip_indexes_on_merge가 활성화되고 인덱스가 exclude_materialize_skip_indexes_on_merge로 제외되지 않은 경우 후속 병합으로도 매터리얼라이즈될 수 있어요. 그렇지 않으면 명시적인 MATERIALIZE INDEX가 실행될 때까지 매터리얼라이즈되지 않은 상태로 남습니다.
CLEAR INDEX
ALTER TABLE [db.]table_name [ON CLUSTER cluster] CLEAR INDEX [IF EXISTS] name [IN PARTITION partition_name] - 설명은 제거하지 않고 디스크에서 보조 인덱스 파일만 삭제해요. mutation으로 구현됩니다.
ADD, DROP, CLEAR 명령은 메타데이터만 변경하거나 파일만 제거한다는 점에서 가벼운(lightweight) 연산이에요.
또한 ClickHouse Keeper 또는 ZooKeeper를 통해 인덱스 메타데이터를 동기화하므로 복제됩니다.
인덱스 조작은 *MergeTree 엔진의 테이블(복제(replicated) 변형 포함)에서만 지원돼요.
Concurrent ALTER and multi-clause MATERIALIZE INDEX
복제 테이블에서, 하나의 테이블에 대한 빠른 개별 ALTER들이 리플리카에 아직 적용되지 않은 상태(메타데이터가 여전히 뒤처져 있음 — 이전 alter가 이미 할당된 후에도 그럴 수 있음)에서는 CANNOT_ASSIGN_ALTER(code 517)을 발생시킬 수 있어요. 이는 일반적인 동시 메타데이터-ALTER/mutation 조건입니다(mutation 전용이 아님). serialize/retry하거나, mutations_sync / system.mutations의 is_done으로 이전에 mutation을 생성한 alter들이 완료될 때까지 기다리거나, 문법이 허용할 때 독립적인 메타데이터 연산들을 하나의 다중 절(multi-clause) ALTER로 결합하세요. Synchronicity of ALTER Queries 및 Concurrent ALTER assignment를 참고하세요.
하나의 ALTER에 여러 MATERIALIZE INDEX 절이 올 수 있어요. 트리 내에서 다루는 사례는 여러 ADD INDEX 절을 같은 새 인덱스들에 대한 MATERIALIZE INDEX와 함께 단일 문으로 묶는 것입니다(tests/queries/0_stateless/02911_add_index_and_materialize_index.sql). 이 묶은 형태는 일반(비-DatabaseReplicated) 데이터베이스용이에요 — DatabaseReplicated는 ADD INDEX + MATERIALIZE INDEX 세그먼트의 혼합을 QUERY_IS_PROHIBITED로 거부합니다. 이미 존재하는 인덱스에 대한 materialize-only 다중 절 형태는 현재 구현에서 동일한 메타데이터 스냅샷 준비 경로를 따르지만, 정확한 형태는 아직 집중된 stateless 테스트로 다루어지지 않았어요 — 그러한 커버리지가 생기기 전까지는 별도로 보장된 계약이라기보다 현재 구현 동작으로 취급하세요. 순서대로 적용하려면 문당 하나의 MATERIALIZE INDEX를 실행하고 mutations_sync로 기다리세요.