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
表的 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(date, (UserId, EventType), 8192);
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。您可以在
WHERE/PREWHERE
子句中设置关于_table
的常量条件(例如,WHERE _table='xyz'
)。在这种情况下,读取操作仅针对满足_table
条件的表执行,因此_table
列充当索引。
参见