Elegir una estrategia de actualización
- Usar motores de tabla especializados que gestionan las actualizaciones mediante inserciones
- Usar actualizaciones declarativas como las sentencias
UPDATE ... SEToALTER TABLE ... UPDATE
Cuándo usar motores de tabla especializados
Como los motores de tabla de la familia MergeTree fusionan las partes de datos en segundo plano, ofrecen consistencia eventual, y es necesario usar la palabra clave
FINAL para garantizar una deduplicación correcta durante ese intervalo al consultar la tabla.
También hay otros tipos de motores, pero estos son los más usados.
Cuándo usar actualizaciones declarativas
UPDATE pueden ser más sencillas para operaciones de actualización simples, sin la complejidad de gestionar la lógica de deduplicación, pero por lo general son más adecuadas para actualizar un número menor de filas y con menos frecuencia que los motores especializados.
Actualizaciones con motores de tabla especializados
ReplacingMergeTree
ReplacingMergeTree deduplica las filas con la misma clave de ordenación durante las combinaciones en segundo plano, conservando solo la versión más reciente.
FINAL o una lógica de consulta equivalente para obtener resultados correctos y deduplicados. El modificador FINAL añade una sobrecarga a la consulta de entre el 21 % y el 550 %, según los datos.
ReplacingMergeTree no puede actualizar los valores de la clave de ordenación. También admite una columna Deleted para eliminaciones lógicas.
Más información: guía de ReplacingMergeTree | referencia de ReplacingMergeTree
CoalescingMergeTree
Nullable para que esto funcione como se espera. Al igual que con ReplacingMergeTree, use FINAL para obtener resultados correctos y consolidados.
Este motor está disponible a partir de ClickHouse 25.6.
Más información: CoalescingMergeTree
CollapsingMergeTree
CollapsingMergeTree usa una columna Sign para indicar a ClickHouse cómo debe gestionar las filas durante las fusiones. Si se inserta -1 en la columna de signo, la fila se colapsará (se eliminará) al emparejarse con una fila +1 correspondiente. Las filas que deben actualizarse se identifican en función de la clave de ordenación usada en la cláusula ORDER BY al crear la tabla.
ReplacingMergeTree, CollapsingMergeTree permite modificar los valores de la clave de ordenación. Es muy adecuado para operaciones reversibles con semántica de cancelación, como las transacciones financieras o el seguimiento del estado de un juego.
El enfoque anterior para las actualizaciones requiere que la aplicación mantenga el estado en el cliente para poder insertar la fila de cancelación. Aunque este es el método más eficiente para ClickHouse, puede resultar complejo de gestionar a escala. Las consultas también requieren agregación con multiplicación por el signo para producir resultados correctos.
Actualizaciones declarativas
Mutaciones
ALTER TABLE ... UPDATE) reescriben todas las partes que contienen filas que cumplen la expresión WHERE.
WHERE.
Este proceso no tiene atomicidad.
Las partes se sustituyen por sus versiones mutadas en cuanto están listas, y una consulta SELECT que empiece a ejecutarse durante una mutación verá datos de partes que ya han sido mutadas junto con datos de partes que aún no han sido mutadas.
Puede seguir el progreso a través de la tabla system.mutations.
Más información: ALTER TABLE UPDATE
Mutaciones sobre la marcha
ALTER TABLE ... UPDATE, puede que tenga que esperar a que se apliquen en segundo plano para ver los valores modificados reflejados en las consultas.
ClickHouse ofrece una forma de cambiar este comportamiento mediante las “mutaciones sobre la marcha”.
Cuando las mutaciones sobre la marcha están habilitadas, las filas actualizadas se marcan como tales de inmediato y las consultas SELECT posteriores devolverán automáticamente los valores modificados.
Las mutaciones sobre la marcha pueden habilitarse para tablas de la familia MergeTree activando la configuración a nivel de consulta apply_mutations_on_fly.
Ejemplo
Ejemplo
Vamos a crear una tabla y ejecutar algunas mutaciones:Comprobemos el resultado de las actualizaciones mediante una consulta Ten en cuenta que los valores de las filas aún no se han actualizado al consultar la nueva tabla:Veamos ahora qué ocurre cuando habilitamos las mutaciones sobre la marcha:La consulta
SELECT:SELECT ahora devuelve inmediatamente el resultado correcto, sin tener que esperar a que se apliquen las mutaciones:Impacto en el rendimiento
SELECT. Sin embargo, tenga en cuenta que las mutaciones siguen materializándose de forma asíncrona en segundo plano, lo que supone un proceso costoso.
Si el número de mutaciones enviadas supera de forma constante al número de mutaciones que se procesan en segundo plano durante cierto intervalo de tiempo, la cola de mutaciones no materializadas que deben aplicarse seguirá creciendo. Esto acabará degradando el rendimiento de las consultas SELECT.
Sugerimos habilitar la configuración apply_mutations_on_fly junto con otras configuraciones a nivel de MergeTree, como number_of_mutations_to_throw y number_of_mutations_to_delay, para limitar el crecimiento indefinido de las mutaciones no materializadas.
Soporte para subconsultas y funciones no deterministas
mutations_max_literal_size_to_replace). Solo se admiten funciones no deterministas constantes (por ejemplo, la función now()).
Estos comportamientos se controlan mediante las siguientes configuraciones:
Actualizaciones ligeras
UPDATE y crea patch parts de inmediato, sin esperar a las fusiones. Los valores actualizados son visibles inmediatamente en las consultas SELECT mediante la aplicación de parches, pero solo se materializan físicamente durante las fusiones posteriores. Esto hace que las actualizaciones ligeras sean ideales para actualizar un pequeño porcentaje de filas (hasta ~10% de la tabla) con una latencia predecible. Los benchmarks muestran que pueden ser hasta 23 veces más rápidas que las mutations.
La desventaja es que las consultas SELECT añaden sobrecarga al aplicar parches, y las patch parts cuentan para los límites de partes. Más allá del umbral de ~10%, la sobrecarga de aplicar parches durante la lectura crece proporcionalmente, lo que hace que las mutations síncronas sean más eficientes para actualizaciones más grandes.
Más información: Lightweight UPDATE
Mutaciones sobre la marcha
Las mutaciones sobre la marcha proporcionan un mecanismo para actualizar filas de forma que las consultasSELECT posteriores devuelvan automáticamente los valores modificados sin tener que esperar al procesamiento en segundo plano. Esto resuelve eficazmente la limitación de atomicidad de las mutaciones normales.
SELECT posteriores requieren que esté habilitada la configuración apply_mutations_on_fly = 1. Las condiciones de la mutación se almacenan en ClickHouse Keeper, que mantiene todo en memoria, y se aplican sobre la marcha durante las consultas.
Tenga en cuenta que se sigue usando una mutación para actualizar los datos; simplemente no se materializa de inmediato. La mutación seguirá aplicándose en segundo plano como un proceso asíncrono y conlleva la misma sobrecarga considerable que una mutación normal. Las expresiones que pueden usarse con esta operación también son limitadas (consulte los detalles).
Más información: Mutaciones sobre la marcha