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.
Hay una guía detallada sobre ReplacingMergeTree, incluidas las buenas prácticas y cómo optimizar el rendimiento, disponible aquí.
Crear una tabla
La unicidad de las filas viene determinada por la cláusula
ORDER BY de la tabla, no por PRIMARY KEY.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.
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.
is_deleted solo puede habilitarse cuando se usa ver.Independientemente de la operación realizada sobre los datos, la versión debe incrementarse. Si dos filas insertadas tienen el mismo número de versión, se conserva la última fila insertada.De forma predeterminada, ClickHouse conservará la última fila de una clave incluso si esa fila es una fila eliminada. Esto permite que cualquier fila futura con versiones inferiores
pueda insertarse de forma segura y que la fila eliminada siga aplicándose.Para eliminar permanentemente esas filas eliminadas, habilite la configuración de tabla allow_experimental_replacing_merge_with_cleanup y haga una de las siguientes acciones:-
Establezca las configuraciones de tabla
enable_replacing_merge_with_cleanup_for_min_age_to_force_merge,min_age_to_force_merge_on_partition_onlyymin_age_to_force_merge_seconds. Si todas las partes de una partición son más antiguas quemin_age_to_force_merge_seconds, ClickHouse las fusionará todas en una sola parte y eliminará cualquier fila eliminada. -
Ejecute manualmente
OPTIMIZE TABLE table [PARTITION partition | PARTITION ID 'partition_id'] FINAL CLEANUP.
Cláusulas de consulta
ReplacingMergeTree, se requieren las mismas cláusulas que al crear una tabla MergeTree.
Deduplicación en tiempo de consulta & FINAL
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:
FINAL produce un recuento incorrecto (el resultado exacto variará en función de las fusiones):
FINAL, incluida la forma de optimizar su rendimiento, recomendamos leer nuestra guía detallada sobre ReplacingMergeTree.