Skip to main content
가설 인덱스는 실제로 생성하거나 저장하지 않고도 MergeTree 계열 테이블에 ATTACH할 수 있는 가상 스킵 인덱스입니다. 이 인덱스는 현재 세션 내에서만 존재하며, 실제 스킵 인덱스가 쿼리에 어떤 영향을 미칠지 추정하기 위해 EXPLAIN WHATIF에서 사용됩니다. 일반적으로 스킵 비율(건너뛸 수 있는 마크의 비율)과 마크 및 바이트 기준의 대략적인 비용을 추정합니다. 가설 인덱스를 사용하면 디스크에 실제로 구체화하는 비용을 들이기 전에 후보 인덱스를 평가할 수 있습니다.

CREATE HYPOTHETICAL INDEX

구문은 ALTER TABLE ... ADD INDEX를 따르지만, 인덱스가 생성되거나 기록되지는 않으며 현재 세션에는 인덱스 설명만 저장됩니다.
  • name — 인덱스 이름입니다. 이 세션에서 (database, table) 내에서 고유해야 합니다.
  • expression — 인덱싱할 컬럼 또는 표현식입니다.
  • TYPE typeminmax, set(N), bloom_filter(p), ngrambf_v1(...), tokenbf_v1(...)입니다. textvector_similarity는 지원되지 않으며 CREATE 시점에 거부됩니다. 실제 ALTER TABLE ... ADD INDEX 검증은 세션 전용 저장소에서 재현할 수 없는 테이블 수준 설정에 의존하기 때문입니다.
  • GRANULARITY value — 인덱스 그래뉼당 데이터 그래뉼 수입니다. 기본값은 1입니다.
대상 테이블은 Atomic 데이터베이스에 있는 MergeTree 계열 테이블이어야 합니다(UUID가 있어야 함). UUID가 없는 테이블(예: 레거시 Ordinary 데이터베이스의 테이블 또는 구문이 오래된 MergeTree)은 거부됩니다. 세션 저장소는 가상의 인덱스를 테이블 UUID를 기준으로 식별하기 때문입니다. 예시

EXPLAIN WHATIF로 가설 인덱스 평가하기

가설 인덱스는 정의만 해서는 아무 효과가 없습니다. 쿼리에 어떤 영향을 미치는지 확인하려면, 대표적인 SELECT에 대해 EXPLAIN WHATIF를 실행하십시오. 추정기는 각 후보 인덱스의 적용 가능성, 읽게 될 마크, 그에 따른 스킵 비율, 그리고 추정값이 어떤 방식으로 산출되었는지(empirical, statistical, 또는 applicability_only)를 보고합니다.
결과:
est_bytes는 테이블의 평균 행 크기를 바탕으로 한 추정값이므로, 정확한 수치는 스토리지와 압축에 따라 달라집니다. 메모리상의 경험적 스캔을 건너뛰고 대신 컬럼 통계(column statistics)를 기준으로 추정하려면, 먼저 관련 컬럼에 이를 정의하고(기본적으로 비활성화됨) 구체화 mutation이 완료될 때까지 기다린 다음, 경험적 경로를 비활성화하십시오:
전체 출력 스키마와 설정은 EXPLAIN WHATIF 참고를 참조하십시오.

가설 인덱스 삭제

현재 세션에서 가설 인덱스를 제거합니다.

DROP ALL HYPOTHETICAL INDEXES

현재 세션에서 정의된 모든 가설 인덱스를 테이블에 관계없이 제거합니다.

범위와 수명

  • 가설 인덱스는 현재 세션에서만 유지되며, 다른 세션에서는 보이지 않고 세션이 종료되면 폐기됩니다.
  • 가설 인덱스를 정의하거나 삭제해도 실제 인덱스가 생성되지는 않으며, 해당 테이블에 대한 일반 쿼리에는 전혀 영향을 주지 않습니다. 실제 EXPLAIN WHATIF 실행 시에는 후보 인덱스를 메모리에 구축하기 위해 테이블 데이터를 읽으며, 이 스캔은 세션의 읽기 제한 및 쿼터에 포함됩니다.
  • 현재 세션의 가설 인덱스는 system.hypothetical_indexes를 통해 확인하십시오.

제한 사항

textvector_similarity 후보는 CREATE HYPOTHETICAL INDEX 시점에 거부됩니다. 실제 검증은 세션 전용 저장소가 복제할 수 없는 테이블 수준 설정에 따라 달라지기 때문입니다. EXPLAIN WHATIFFINAL이 포함된 쿼리에 대해 status: not_applicable를 표시합니다(스킵 인덱스 프루닝이 PrimaryKeyExpand와 상호작용함). 또한 쿼리가 프로젝션에서 처리되는 경우 NOT_IMPLEMENTED 오류를 반환합니다(부모 테이블 인덱스는 프로젝션 파트에 구체화되지 않습니다). 경험적 skip_ratio상한입니다. 남아 있는 각 그래뉼을 개별적으로 집계하며, seek-gap 병합(merge_tree_min_rows_for_seek / merge_tree_min_bytes_for_seek)이나 논리합(OR) 프레디케이트에서 후보와 기존 스킵 인덱스의 조합은 모델링하지 않습니다. 따라서 실제 구체화된 인덱스는 약간 더 많이 읽을 수도 있고, 추정치로는 프루닝되지 않는 경우를 실제로는 프루닝할 수도 있습니다.

필요한 권한

CREATE HYPOTHETICAL INDEX에는 인덱스 표현식에서 참조하는 컬럼에 대한 SELECT 권한이 필요합니다. 경험적 EXPLAIN WHATIF가 해당 컬럼을 읽기 때문에 컬럼 수준 SELECT(예: GRANT SELECT(b))만으로도 충분합니다. DROP HYPOTHETICAL INDEXDROP ALL HYPOTHETICAL INDEXES에는 추가 권한이 필요하지 않습니다. 세션 로컬 저장소의 항목만 제거합니다.

관련 항목

마지막 수정일 2026년 7월 23일