Merge 테이블 엔진

Merge 테이블 엔진

Merge 엔진(헷갈리지 마세요, MergeTree가 아님)은 자체적으로는 데이터를 저장하지 않지만, 다른 여러 테이블에서 동시에 읽는 것을 허용해요. 읽기는 자동으로 병렬화되며, 테이블에 대한 쓰기는 지원되지 않습니다. 주로 많은 수의 TinyLog 테이블을 하나의 테이블처럼 다루는 데 사용합니다.

출처: 문서

본문

Merge 엔진(MergeTree와 혼동하지 마세요)은 자체적으로 데이터를 저장하지 않지만, 다른 여러 테이블에서 동시에 읽는 것을 허용합니다.

읽기는 자동으로 병렬화됩니다. 테이블에 대한 쓰기는 지원되지 않습니다. 읽을 때 실제로 읽히는 테이블의 인덱스가 존재한다면 사용됩니다.

테이블 생성 (Creating a table)

CREATE TABLE ... Engine=Merge(db_name, tables_regexp)

엔진 매개변수 (Engine parameters)

db_name

db_name — 가능한 값:

  • 데이터베이스 이름,
  • 데이터베이스 이름이 있는 문자열을 반환하는 상수 표현식. 예: currentDatabase(),
  • REGEXP(expression). 여기서 expression은 DB 이름을 일치시키는 정규식.

tables_regexp

tables_regexp — 지정된 DB 또는 DB들에서 테이블 이름을 일치시키는 정규식.

정규식 — re2 (PCRE의 부분집합 지원), 대소문자 구분. "match" 섹션의 정규식에서 기호 이스케이프에 대한 참고 사항을 보세요.

사용 (Usage)

읽을 테이블을 선택할 때, Merge 테이블 자체는 정규식과 일치하더라도 선택되지 않습니다. 이것은 루프를 피하기 위함입니다.

서로의 데이터를 끝없이 읽으려고 하는 두 Merge 테이블을 만드는 것이 가능하지만, 좋은 생각은 아니에요.

Merge 엔진을 사용하는 전형적인 방법은 많은 수의 TinyLog 테이블을 하나의 테이블처럼 작업하는 것입니다.

예시 (Examples)

예시 1

두 데이터베이스 ABC_corporate_site와 ABC_store를 생각해 볼게요. all_visitors 테이블은 두 데이터베이스의 visitors 테이블에서 ID를 포함할 거예요.

CREATE TABLE all_visitors (id UInt32) ENGINE=Merge(REGEXP('ABC_*'), 'visitors');

예시 2

WatchLog_old라는 오래된 테이블이 있고, 데이터를 새 테이블 WatchLog_new로 옮기지 않고 파티셔닝을 변경하기로 결정했다고 가정해 봐요. 두 테이블의 데이터를 모두 보아야 한다면:

CREATE TABLE WatchLog_old(
    date Date,
    UserId Int64,
    EventType String,
    Cnt UInt64
)
ENGINE=MergeTree
ORDER BY (date, UserId, EventType);

INSERT INTO WatchLog_old VALUES ('2018-01-01', 1, 'hit', 3);

CREATE TABLE WatchLog_new(
    date Date,
    UserId Int64,
    EventType String,
    Cnt UInt64
)
ENGINE=MergeTree
PARTITION BY date
ORDER BY (UserId, EventType)
SETTINGS index_granularity=8192;

INSERT INTO WatchLog_new VALUES ('2018-01-02', 2, 'hit', 3);

CREATE TABLE WatchLog AS WatchLog_old ENGINE=Merge(currentDatabase(), '^WatchLog');

SELECT * FROM WatchLog;
┌───────date─┬─UserId─┬─EventType─┬─Cnt─┐
│ 2018-01-01 │      1 │ hit       │   3 │
└────────────┴────────┴───────────┴─────┘
┌───────date─┬─UserId─┬─EventType─┬─Cnt─┐
│ 2018-01-02 │      2 │ hit       │   3 │
└────────────┴────────┴───────────┴─────┘

가상 컬럼 (Virtual columns)

  • _table — 데이터가 읽힌 테이블의 이름. 타입: String. _table로 필터링하면(예: WHERE _table='xyz') 필터 조건을 만족하는 테이블만 읽힙니다. 다른 테이블에서 읽는 테이블(Distributed, Merge, Buffer, Alias)은 실제로 그 행을 생성한 테이블의 이름을 가진 행을 반환하므로, 그러한 테이블은 항상 읽히고 필터는 그 행에 적용됩니다.
  • _database — 데이터가 읽힌 데이터베이스의 이름. 타입: String.

더 알아보기 (Learn more)