Перейти к основному содержанию
Перейти к основному содержанию

Движок таблицы Merge

Движок Merge (не путать с MergeTree) сам не хранит данные, но позволяет одновременно читать из любого количества других таблиц.

Чтение автоматически распараллеливается. Запись в таблицу не поддерживается. При чтении используются индексы таблиц, из которых фактически производится чтение, если они есть.

Создание таблицы

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

Параметры движка

db_name

db_name — возможные значения:

  • имя базы данных,
  • константное выражение, которое возвращает строку с именем базы данных, например currentDatabase(),
  • REGEXP(expression), где expression — регулярное выражение для сопоставления имен баз данных.

tables_regexp

tables_regexp — регулярное выражение для сопоставления имен таблиц в указанной БД или нескольких БД.

Регулярные выражения обрабатываются библиотекой re2 (поддерживает подмножество PCRE) и чувствительны к регистру. См. примечания об экранировании символов в регулярных выражениях в разделе «match».

Использование

При выборе таблиц для чтения сама таблица Merge не выбирается, даже если она подходит под регулярное выражение. Это сделано, чтобы избежать циклов. Можно создать две таблицы Merge, которые будут бесконечно пытаться читать данные друг друга, но это не лучшая идея.

Типичный сценарий использования движка Merge — работа с большим количеством таблиц TinyLog так, как будто это одна таблица.

Примеры

Пример 1

Рассмотрим две базы данных ABC_corporate_site и ABC_store. Таблица all_visitors будет содержать идентификаторы из таблиц visitors обеих баз данных.

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 │
└────────────┴────────┴───────────┴─────┘

Виртуальные столбцы

  • _table — имя таблицы, из которой были прочитаны данные. Тип: String.

    Если отфильтровать по _table (например, WHERE _table='xyz'), будут прочитаны только те таблицы, которые удовлетворяют условию фильтрации.

  • _database — имя базы данных, из которой были прочитаны данные. Тип: String.

См. также