Join 테이블 엔진

Join 테이블 엔진

Join 엔진은 JOIN 연산에서 사용하기 위한 선택적 준비(prepared) 데이터 구조예요. 조인 테이블의 데이터는 항상 RAM에 상주하며, JOIN 절의 오른쪽(우측) 테이블로 사용하거나 joinGet 함수로 딕셔너리처럼 데이터를 추출할 수 있답니다.

출처: 문서

본문

JOIN 연산에서 사용하기 위한 선택적 준비(prepared) 데이터 구조입니다.

ClickHouse Cloud에서 서비스가 25.4 이전 버전으로 생성된 경우, SET compatibility=25.4를 사용하여 호환성을 최소 25.4로 설정해야 합니다.

테이블 생성 (Creating a table)

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
) ENGINE = Join(join_strictness, join_type, k1[, k2, ...])

CREATE TABLE 쿼리의 자세한 설명을 참조하세요.

엔진 매개변수 (Engine parameters)

join_strictness

join_strictness – JOIN의 엄격성(strictness).

join_type

join_type – JOIN 유형.

키 컬럼 (Key columns)

k1[, k2, ...] – JOIN 연산이 수행되는 USING 절의 키 컬럼.

join_strictness와 join_type 매개변수를 따옴표 없이 입력하세요. 예: Join(ANY, LEFT, col1). 이 값들은 테이블이 사용될 JOIN 연산과 일치해야 합니다. 매개변수가 일치하지 않으면 ClickHouse는 예외를 발생시키지 않고 잘못된 데이터를 반환할 수 있어요.

특이사항 및 권장사항 (Specifics and recommendations)

데이터 저장 (Data storage)

Join 테이블 데이터는 항상 RAM에 있습니다. 테이블에 행을 삽입하면 ClickHouse는 서버가 재시작될 때 복원할 수 있도록 데이터 블록을 디스크의 디렉토리에 기록합니다.

서버가 잘못 재시작되면 디스크의 데이터 블록이 손실되거나 손상될 수 있어요. 이 경우 손상된 데이터가 있는 파일을 수동으로 삭제해야 할 수 있습니다.

데이터 선택 및 삽입 (Selecting and Inserting Data)

INSERT 쿼리를 사용하여 Join 엔진 테이블에 데이터를 추가할 수 있어요. 테이블이 ANY 엄격성으로 생성된 경우 중복 키의 데이터는 무시됩니다. ALL 엄격성에서는 모든 행이 추가됩니다.

Join 엔진 테이블의 주요 사용 사례는 다음과 같습니다:

  • 테이블을 JOIN 절의 오른쪽에 배치.
  • 테이블에서 딕셔너리처럼 데이터를 추출할 수 있는 joinGet 함수 호출.

데이터 삭제 (Deleting data)

Join 엔진 테이블에 대한 ALTER DELETE 쿼리는 mutation으로 구현됩니다. DELETE mutation은 필터링된 데이터를 읽고 메모리와 디스크의 데이터를 덮어씁니다.

제한 사항 및 설정 (Limitations and settings)

테이블을 만들 때 다음 설정이 적용됩니다:

join_use_nulls

join_use_nulls

max_rows_in_join

max_rows_in_join

max_bytes_in_join

max_bytes_in_join

join_overflow_mode

join_overflow_mode

join_any_take_last_row

join_any_take_last_row

join_use_nulls
Persistent

Join 및 Set 테이블 엔진에 대한 지속성(persistency)을 비활성화합니다.

I/O 오버헤드를 줄입니다. 성능을 추구하고 지속성이 필요하지 않은 시나리오에 적합합니다.

가능한 값:

  • 1 — 활성화.
  • 0 — 비활성화.

기본값: 1.

Join 엔진 테이블은 GLOBAL JOIN 연산에 사용할 수 없습니다.

Join 엔진은 CREATE TABLE 문에서 join_use_nulls 설정을 지정할 수 있습니다. SELECT 쿼리는 동일한 join_use_nulls 값을 가져야 합니다.

사용 예시 (Usage examples)

좌측(왼쪽) 테이블 생성:

CREATE TABLE id_val(`id` UInt32, `val` UInt32) ENGINE = TinyLog;
INSERT INTO id_val VALUES (1,11), (2,12), (3,13);

우측 Join 테이블 생성:

CREATE TABLE id_val_join(`id` UInt32, `val` UInt8) ENGINE = Join(ANY, LEFT, id);
INSERT INTO id_val_join VALUES (1,21), (1,22), (3,23);

테이블 조인:

SELECT * FROM id_val ANY LEFT JOIN id_val_join USING (id);
┌─id─┬─val─┬─id_val_join.val─┐
│  1 │  11 │              21 │
│  2 │  12 │               0 │
│  3 │  13 │              23 │
└────┴─────┴─────────────────┘

대안으로 Join 테이블에서 조인 키 값을 지정하여 데이터를 가져올 수 있어요:

SELECT joinGet('id_val_join', 'val', toUInt32(1));
┌─joinGet('id_val_join', 'val', toUInt32(1))─┐
│                                         21 │
└────────────────────────────────────────────┘

Join 테이블에서 행 삭제:

ALTER TABLE id_val_join DELETE WHERE id = 3;
┌─id─┬─val─┐
│  1 │  21 │
└────┴─────┘

더 알아보기 (Learn more)