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가 필요하지 않습니다.