2020-10-26 10:29:30 +00:00
---
2022-08-26 17:37:11 +00:00
slug: /ru/engines/table-engines/mergetree-family/replacingmergetree
2022-04-09 13:29:05 +00:00
sidebar_position: 33
sidebar_label: ReplacingMergeTree
2020-10-26 10:29:30 +00:00
---
2020-03-20 18:20:59 +00:00
# ReplacingMergeTree {#replacingmergetree}
2017-03-12 17:58:51 +00:00
2020-12-01 03:10:34 +00:00
Движок отличается от [MergeTree ](mergetree.md#table_engines-mergetree ) тем, что выполняет удаление дублирующихся записей с одинаковым значением [ключа сортировки ](mergetree.md ) (секция `ORDER BY` , не `PRIMARY KEY` ).
2017-03-12 17:58:51 +00:00
2018-10-19 11:25:22 +00:00
Дедупликация данных производится лишь во время слияний. Слияние происходят в фоне в неизвестный момент времени, на который вы не можете ориентироваться. Некоторая часть данных может остаться необработанной. Хотя вы можете вызвать внеочередное слияние с помощью запроса `OPTIMIZE` , на это не стоит рассчитывать, так как запрос `OPTIMIZE` приводит к чтению и записи большого объёма данных.
2017-03-12 17:58:51 +00:00
2018-10-19 11:25:22 +00:00
Таким образом, `ReplacingMergeTree` подходит для фоновой чистки дублирующихся данных в целях экономии места, но не даёт гарантии отсутствия дубликатов.
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
## Создание таблицы {#sozdanie-tablitsy}
2018-10-19 11:25:22 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2018-10-19 11:25:22 +00:00
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, ...]
2017-10-25 05:27:09 +00:00
```
2017-03-12 17:58:51 +00:00
2020-04-30 18:19:18 +00:00
Описание параметров запроса смотрите в [описании запроса ](../../../engines/table-engines/mergetree-family/replacingmergetree.md ).
2018-10-19 11:25:22 +00:00
2022-08-18 19:34:14 +00:00
:::warning "Внимание"
Уникальность строк определяется `ORDER BY` секцией таблицы, а не `PRIMARY KEY` .
:::
2018-10-19 11:25:22 +00:00
2022-08-18 19:34:14 +00:00
## Параметры ReplacingMergeTree
2018-10-19 11:25:22 +00:00
2022-08-18 19:34:14 +00:00
### ver
`ver` — столбец с номером версии. Тип `UInt*` , `Date` , `DateTime` или `DateTime64` . Необязательный параметр.
При слиянии `ReplacingMergeTree` оставляет только строку для каждого уникального ключа сортировки:
2018-10-19 11:25:22 +00:00
2021-05-26 19:26:08 +00:00
- Последнюю в выборке, если `ver` не задан. Под выборкой здесь понимается набор строк в наборе кусков данных, участвующих в слиянии. Последний по времени создания кусок (последняя вставка) будет последним в выборке. Таким образом, после дедупликации для каждого значения ключа сортировки останется самая последняя строка из самой последней вставки.
2022-06-08 02:26:54 +00:00
- С максимальной версией, если `ver` задан. Если `ver` одинаковый у нескольких строк, то для них используется правило -- если `ver` не задан, т.е . в результате слияния останется самая последняя строка из самой последней вставки.
2018-10-19 11:25:22 +00:00
2022-08-18 19:34:14 +00:00
Пример:
```sql
-- 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 │
└─────┴─────────┴─────────────────────┘
```
## Секции запроса
2018-10-19 11:25:22 +00:00
2018-12-12 17:28:00 +00:00
При создании таблицы `ReplacingMergeTree` используются те же [секции ](mergetree.md ), что и при создании таблицы `MergeTree` .
2018-10-19 11:25:22 +00:00
2020-03-20 18:20:59 +00:00
< details markdown = "1" >
2018-10-19 11:25:22 +00:00
2020-03-20 18:20:59 +00:00
< summary > Устаревший способ создания таблицы< / summary >
2022-08-18 19:34:14 +00:00
:::warning "Внимание"
2022-08-19 02:58:54 +00:00
Н е используйте этот способ в новых проектах и по возможности переведите старые проекты на способ, описанный выше.
2022-08-18 19:34:14 +00:00
:::
2020-03-20 18:20:59 +00:00
``` sql
2018-10-19 11:25:22 +00:00
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])
```
2017-03-12 17:58:51 +00:00
2018-10-19 11:25:22 +00:00
В с е параметры, кроме `ver` имеют то же значение, что в и `MergeTree` .
2017-03-12 17:58:51 +00:00
2021-05-26 19:18:34 +00:00
- `ver` — столбец с номером версии. Необязательный параметр. Описание смотрите выше по тексту.
2020-03-20 18:20:59 +00:00
2018-10-19 11:25:22 +00:00
< / details >