跳至主要内容

ReplacingMergeTree

该引擎与 MergeTree 的区别在于,它会删除具有相同 排序键 值(ORDER BY 表部分,而不是 PRIMARY KEY)的重复条目。

数据重复删除仅在合并过程中发生。合并是在后台发生的,时间未知,因此您无法规划它。部分数据可能仍然未处理。虽然您可以使用 OPTIMIZE 查询运行非计划合并,但不要依赖它,因为 OPTIMIZE 查询将读取和写入大量数据。

因此,ReplacingMergeTree 适用于在后台清除重复数据以节省空间,但它不能保证不存在重复数据。

创建表

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = ReplacingMergeTree([ver [, is_deleted]])
[PARTITION BY expr]
[ORDER BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

有关请求参数的描述,请参见 语句描述

注意

行的唯一性由 ORDER BY 表部分决定,而不是 PRIMARY KEY

ReplacingMergeTree 参数

ver

ver - 版本号列。类型为 UInt*DateDateTimeDateTime64。可选参数。

合并时,ReplacingMergeTree 会从所有具有相同排序键的行列中只保留一行

  • 如果未设置 ver,则保留选择中的最后一行。选择是在参与合并的一组部分中的一组行。最近创建的部分(最后一个插入)将是选择中的最后一个部分。因此,在重复数据删除后,将为每个唯一的排序键保留最近插入中最新的最后一行。
  • 如果指定了 ver,则保留具有最大版本号的行。如果 ver 在多行中相同,则将使用“如果未指定 ver”规则,即保留最后插入的行。

示例

-- without ver - the last inserted 'wins'
CREATE TABLE myFirstReplacingMT
(
`key` Int64,
`someCol` String,
`eventTime` DateTime
)
ENGINE = ReplacingMergeTree
ORDER BY key;

INSERT INTO myFirstReplacingMT Values (1, 'first', '2020-01-01 01:01:01');
INSERT INTO myFirstReplacingMT Values (1, 'second', '2020-01-01 00:00:00');

SELECT * FROM myFirstReplacingMT FINAL;

┌─key─┬─someCol─┬───────────eventTime─┐
1second2020-01-01 00:00:00
└─────┴─────────┴─────────────────────┘


-- with ver - the row with the biggest ver 'wins'
CREATE TABLE mySecondReplacingMT
(
`key` Int64,
`someCol` String,
`eventTime` DateTime
)
ENGINE = ReplacingMergeTree(eventTime)
ORDER BY key;

INSERT INTO mySecondReplacingMT Values (1, 'first', '2020-01-01 01:01:01');
INSERT INTO mySecondReplacingMT Values (1, 'second', '2020-01-01 00:00:00');

SELECT * FROM mySecondReplacingMT FINAL;

┌─key─┬─someCol─┬───────────eventTime─┐
1first2020-01-01 01:01:01
└─────┴─────────┴─────────────────────┘

is_deleted

is_deleted - 合并期间用于确定此行中的数据代表状态还是要删除的数据的列的名称;1 表示“已删除”行,0 表示“状态”行。

列数据类型 - UInt8

注意

is_deleted 只能在使用 ver 时启用。

仅当 OPTIMIZE ... FINAL CLEANUP 时才会删除该行。此 CLEANUP 特殊关键字默认情况下不允许,除非启用了 allow_experimental_replacing_merge_with_cleanup MergeTree 设置。

无论对数据的操作如何,版本都必须增加。如果两个插入的行具有相同的版本号,则保留最后插入的行。

示例

-- with ver and is_deleted
CREATE OR REPLACE TABLE myThirdReplacingMT
(
`key` Int64,
`someCol` String,
`eventTime` DateTime,
`is_deleted` UInt8
)
ENGINE = ReplacingMergeTree(eventTime, is_deleted)
ORDER BY key
SETTINGS allow_experimental_replacing_merge_with_cleanup = 1;

INSERT INTO myThirdReplacingMT Values (1, 'first', '2020-01-01 01:01:01', 0);
INSERT INTO myThirdReplacingMT Values (1, 'first', '2020-01-01 01:01:01', 1);

select * from myThirdReplacingMT final;

0 rows in set. Elapsed: 0.003 sec.

-- delete rows with is_deleted
OPTIMIZE TABLE myThirdReplacingMT FINAL CLEANUP;

INSERT INTO myThirdReplacingMT Values (1, 'first', '2020-01-01 00:00:00', 0);

select * from myThirdReplacingMT final;

┌─key─┬─someCol─┬───────────eventTime─┬─is_deleted─┐
1first2020-01-01 00:00:000
└─────┴─────────┴─────────────────────┴────────────┘

查询子句

创建 ReplacingMergeTree 表时,需要与创建 MergeTree 表时相同的 子句

创建表的已弃用方法
注意

在新的项目中不要使用这种方法,并且如果可能,请将旧项目切换到上面描述的方法。

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE [=] ReplacingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [ver])

ver 之外的所有参数都与 MergeTree 中的含义相同。

  • ver - 版本号列。可选参数。有关说明,请参阅上面的文本。