Движок Merge (не путать с MergeTree) не хранит данные самостоятельно, но позволяет одновременно читать данные из любого количества других таблиц.
Чтение автоматически распараллеливается. Запись в таблицу не поддерживается. При чтении используются индексы таблиц, из которых фактически выполняется чтение, если они существуют.
Создание таблицы
CREATE TABLE ... Engine=Merge(db_name, tables_regexp)Параметры движка
db_name
db_name — Возможные значения:
- имя базы данных,
- константное выражение, возвращающее строку с именем базы данных, например,
currentDatabase(), REGEXP(expression), гдеexpression— регулярное выражение для сопоставления имён баз данных.
- константное выражение, возвращающее строку с именем базы данных, например,
tables_regexp
tables_regexp — регулярное выражение для сопоставления с именами таблиц в указанной DB или нескольких DB.
Регулярные выражения — 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.
См. также
- Виртуальные столбцы
- табличная функция merge