HYPOTHETICAL PROJECTION
HYPOTHETICAL PROJECTION
가상 프로젝션(hypothetical projection)은 실제로 만들거나 저장하지 않고 MergeTree 계열 테이블에 붙일 수 있는 가상의 세션 범위 프로젝션이에요. 그것은 현재 세션 안에서만 존재하며 EXPLAIN WHATIF에 나열됩니다.
EXPLAIN WHATIF는 아직 가상 프로젝션의 이점을 추정하지 않습니다 — 각각을 status: not_applicable로 보고합니다. 정의하는 것은 오늘날 매터리얼라이즈하지 않고 테이블에 대해 정의를 검증하고, system.hypothetical_projections을 읽는 도구에 유용해요.
출처: 문서
본문
CREATE HYPOTHETICAL PROJECTION
CREATE HYPOTHETICAL PROJECTION [IF NOT EXISTS] name
ON [db.]table_name (SELECT <columns> [WHERE ...] [GROUP BY ...] [ORDER BY ...]) [WITH SETTINGS (...)]
CREATE HYPOTHETICAL PROJECTION [IF NOT EXISTS] name
ON [db.]table_name INDEX <expression> TYPE <projection_index_type> [WITH SETTINGS (...)]
문법은 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, 불변 디스크는 거부됩니다.
Example
CREATE HYPOTHETICAL PROJECTION p_by_b ON t (SELECT a, b ORDER BY b);
CREATE HYPOTHETICAL PROJECTION p_idx ON t INDEX b TYPE basic;
DROP HYPOTHETICAL PROJECTION
DROP HYPOTHETICAL PROJECTION [IF EXISTS] name ON [db.]table_name
현재 세션에서 가상 프로젝션을 제거해요.
DROP ALL HYPOTHETICAL PROJECTIONS
DROP ALL HYPOTHETICAL PROJECTIONS
테이블과 무관하게 현재 세션에서 정의된 모든 가상 프로젝션을 지워요. 가상 인덱스는 건드리지 않습니다. DROP ALL HYPOTHETICAL INDEXES는 그 반대예요.
Scope and lifetime
- 가상 프로젝션은 현재 세션에서만 존재해요 — 다른 세션에는 보이지 않으며 세션이 끝나면 버려집니다.
- 하나를 정의하거나 버리는 것은 어떤 프로젝션도 만들지 않으며 테이블에 대한 일반 쿼리에 절대 영향을 주지 않아요.
- 현재 세션의 가상 프로젝션은
system.hypothetical_projections으로 검사하세요.
Required privileges
CREATE HYPOTHETICAL PROJECTION은 테이블에 대한 ALTER ADD PROJECTION이 필요해요 — 실제 ALTER TABLE ... ADD PROJECTION이 필요로 하는 것과 같은 권한입니다 — 정의를 테이블의 컬럼에 대해 검증하기 때문입니다. 테이블 데이터를 읽지 않으므로 프로젝션 컬럼에 대한 SELECT는 아직 필요하지 않습니다. EXPLAIN WHATIF가 프로젝션을 추정하기 시작하면 그 컬럼들을 읽을 것이고, 그때는 CREATE HYPOTHETICAL INDEX에서 이미 그런 것처럼 컬럼 수준 SELECT가 필요해질 것입니다.
DROP HYPOTHETICAL PROJECTION은 같은 권한이 필요하므로, drop에서 테이블 이름을 지정해도 그것이 존재하는지 또는 자격이 있는지 드러내지 않습니다. DROP ALL HYPOTHETICAL PROJECTIONS는 테이블 이름을 지정하지 않으며 권한이 필요하지 않습니다.