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]) [PARTITION BY expr] [ORDER BY expr] [SAMPLE BY expr] [SETTINGS name=value, ...]
Уникальность строк определяется секцией таблицы
ORDER BY
, а не PRIMARY KEY
.Пример-- 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─┐ │ 1 │ second │ 2020-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─┐ │ 1 │ first │ 2020-01-01 01:01:01 │ └─────┴─────────┴─────────────────────┘