El motor se diferencia de MergeTree en que elimina las entradas duplicadas con el mismo valor de la clave de ordenación (sección de la tabla ORDER BY, no PRIMARY KEY).
La deduplicación de datos se produce solo durante una fusión. Las fusiones se realizan en segundo plano en un momento indeterminado, por lo que no se pueden planificar. Es posible que parte de los datos permanezca sin procesar. Aunque puedes ejecutar una fusión no programada mediante la consulta OPTIMIZE, no debes confiar en ello, ya que la consulta OPTIMIZE leerá y escribirá una gran cantidad de datos.
Por lo tanto, ReplacingMergeTree es adecuado para eliminar datos duplicados en segundo plano y ahorrar espacio, pero no garantiza la ausencia de duplicados.
Crear una tabla
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, ...]Para ver una descripción de los parámetros de la solicitud, consulte la descripción de la sentencia.
Parámetros de ReplacingMergeTree
ver
ver — columna con el número de versión. Tipo UInt*, Date, DateTime o DateTime64. Parámetro opcional.
Al realizar la fusión, ReplacingMergeTree deja solo una de todas las filas con la misma clave de ordenación:
- La última de la selección, si no se especifica
ver. Una selección es un conjunto de filas en un conjunto de partes que participan en la fusión. La parte creada más recientemente (el último insert) será la última de la selección. Por lo tanto, tras la deduplicación, permanecerá la última fila del insert más reciente para cada clave de ordenación única. - La que tenga la versión máxima, si se especifica
ver. Siveres el mismo para varias filas, se aplicará la regla "si no se especificaver" para ellas; es decir, permanecerá la fila insertada más recientemente.
Ejemplo:
-- sin ver: gana la última fila insertada
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;
┌is_deleted
is_deleted — Nombre de una columna utilizada durante una fusión para determinar si los datos de esta fila representan el estado o si deben eliminarse; 1 es una fila "eliminada" y 0 es una fila de "estado".
Tipo de datos de la columna — UInt8.
Ejemplo:
-- con ver e 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.
-- eliminar filas con is_deleted
OPTIMIZE TABLE myThirdReplacingMT FINAL CLEANUP;
INSERT INTO myThirdReplacingMT Values (1, 'first', '2020-01-01 00:00:00', 0);
select * from myThirdReplacingMT final;
┌Cláusulas de consulta
Al crear una tabla ReplacingMergeTree, se requieren las mismas cláusulas que al crear una tabla MergeTree.
Método obsoleto para crear una tabla
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])Todos los parámetros, excepto ver, tienen el mismo significado que en MergeTree.
ver- columna con la versión. Parámetro opcional. Para ver una descripción, consulte el texto anterior.
Deduplicación en tiempo de consulta & FINAL
Durante las fusiones, ReplacingMergeTree identifica las filas duplicadas usando los valores de las columnas ORDER BY (utilizadas para crear la tabla) como identificador único, y conserva solo la versión más reciente. Sin embargo, esto solo ofrece corrección eventual: no garantiza que las filas se dedupliquen, y no debe depender de ello. Por lo tanto, las consultas pueden producir respuestas incorrectas porque tienen en cuenta filas de actualización y filas eliminadas.
Para obtener respuestas correctas, los usuarios deberán complementar las fusiones en segundo plano con la deduplicación en tiempo de consulta y la eliminación de filas borradas. Esto puede lograrse usando el operador FINAL. Por ejemplo, considere el siguiente ejemplo:
CREATE TABLE rmt_example
(
`number` UInt16
)
ENGINE = ReplacingMergeTree
ORDER BY number
INSERT INTO rmt_example SELECT floor(randUniform(0, 100)) AS number
FROM numbers(1000000000)
0 rows in set. Elapsed: 19.958 sec. Processed 1.00 billion rows, 8.00 GB (50.11 million rows/s., 400.84 MB/s.)Hacer una consulta sin FINAL produce un recuento incorrecto (el resultado exacto variará en función de las fusiones):
SELECT count()
FROM rmt_example
┌Añadir FINAL produce un resultado correcto:
SELECT count()
FROM rmt_example
FINAL
┌Para obtener más información sobre FINAL, incluida la forma de optimizar su rendimiento, recomendamos leer nuestra guía detallada sobre ReplacingMergeTree.