Skip to main content
가상 프로젝션(hypothetical projections)은 세션 범위의 가상 프로젝션으로, 실제로 빌드하거나 저장하지 않고도 MergeTree 엔진 계열 테이블에 ATTACH할 수 있습니다. 이러한 프로젝션은 현재 세션 안에서만 존재하며 EXPLAIN WHATIF로 조회할 수 있습니다. EXPLAIN WHATIF는 일반(정렬된) 가상 프로젝션에 대해 쿼리에서 프로젝션을 읽을 때 접근하는 마크와 행의 수, 최적화기가 기본 테이블 대신 해당 프로젝션을 선택할지를 추정합니다. 모든 프로젝션이 추정 대상은 아닙니다. 집계 프로젝션과 WHERE 절이 있는 프로젝션은 추정 대상에서 제외되며, 추정되지 않은 후보는 그 이유와 함께 표시됩니다. 전체 목록은 EXPLAIN WHATIF를 참조하십시오. 현재 세션의 가상 프로젝션은 system.hypothetical_projections에서도 확인할 수 있습니다.

CREATE HYPOTHETICAL PROJECTION

구문은 ALTER TABLE ... ADD PROJECTION과 동일하며, 정의 역시 완전히 같은 방식으로 검사됩니다. 따라서 여기서 거부된 프로젝션은 실제로도 구체화될 수 없습니다. 아무것도 생성되거나 기록되지 않고, 설명만 현재 세션에 저장됩니다.
  • name — 프로젝션 이름입니다. 해당 세션 내에서 (database, table) 단위로 고유해야 하며, 테이블에 존재하는 실제 프로젝션과 이름이 겹쳐서는 안 됩니다.
  • 본문은 실제 프로젝션과 동일한 형태를 허용합니다. 즉, ORDER BY를 사용하는 재정렬 프로젝션, GROUP BY를 사용하는 집계 프로젝션, WHERE를 사용하는 필터링 프로젝션, 또는 프로젝션 인덱스 형태인 INDEX <expression> TYPE <projection_index_type>을 사용할 수 있습니다.
  • WITH SETTINGS (...)도 허용되며 그대로 보존됩니다. 해당 설정은 system.hypothetical_projections에서 확인할 수 있습니다.
대상 테이블은 Atomic 데이터베이스에 있는 MergeTree 엔진 계열 테이블이어야 합니다(즉, UUID가 있어야 합니다). 세션 저장소가 테이블 UUID를 키로 항목을 저장하기 때문입니다. 실제 ADD PROJECTION에 적용되는 제약도 여기에 그대로 적용됩니다. 즉, UNIQUE KEY가 있는 테이블, deduplicate_merge_projection_mode = throw 상태에서 Ordinary가 아닌 머지 모드, 구 문법 MergeTree, 변경 불가능한 디스크는 거부됩니다. 예시

DROP HYPOTHETICAL PROJECTION

현재 세션에서 가상 프로젝션을 제거합니다.

DROP ALL HYPOTHETICAL PROJECTIONS

현재 세션에 정의된 모든 가상 프로젝션을 테이블에 관계없이 삭제합니다. 가상 인덱스는 그대로 유지되며, DROP ALL HYPOTHETICAL INDEXES는 이와 반대로 동작합니다.

범위와 수명

  • 가상 프로젝션은 현재 세션에만 존재합니다. 다른 세션에서는 보이지 않으며, 세션이 종료되면 사라집니다.
  • 가상 프로젝션을 정의하거나 삭제해도 실제 프로젝션이 생성되지 않으며, 해당 테이블에 대한 일반 쿼리에도 전혀 영향을 주지 않습니다.
  • 현재 세션의 가상 프로젝션은 system.hypothetical_projections에서 확인할 수 있습니다.

필요한 privilege

CREATE HYPOTHETICAL PROJECTION은 정의가 테이블의 컬럼과 맞는지 검사하기 때문에, 테이블에 대한 ALTER ADD PROJECTION privilege가 필요합니다. 이는 실제 ALTER TABLE ... ADD PROJECTION에 필요한 privilege와 동일합니다. EXPLAIN WHATIF가 프로젝션을 추정하려면 프로젝션 컬럼에 대한 컬럼 수준의 SELECT 권한이 필요합니다. 이는 CREATE HYPOTHETICAL INDEX에도 이미 적용됩니다. DROP HYPOTHETICAL PROJECTION에도 동일한 privilege가 필요합니다. 삭제 구문에 테이블 이름을 지정하는 것만으로 해당 테이블의 존재 여부나 적용 가능 여부가 드러나지 않도록 하기 위함입니다. 또한 EXPLAIN WHATIF는 저장된 정의가 테이블과 맞는지 검사하기 전에 해당 privilege를 다시 확인합니다. DROP ALL HYPOTHETICAL PROJECTIONS는 테이블 이름을 지정하지 않으므로 privilege가 필요하지 않습니다.

관련 항목