Mutaciones

En lo que respecta a actualizaciones y borrados, es bien sabido que las bases de datos anal铆ticas y transaccionales adoptan enfoques diferentes debido a sus filosof铆as de dise帽o subyacentes y a los casos de uso a los que van dirigidas. ClickHouse es una base de datos orientada a columnas optimizada para OLAP de manera que, en la pr谩ctica, supone convertir borrados y actualizaciones en inserciones de adici贸n que se procesan de forma as铆ncrona y/o s铆ncrona (en el momento de la lectura)

Existen dos enfoques fundamentales para actualizar/borrar datos en ClickHouse:

  • Utilizar motores de tabla especializados que gestionan las actualizaciones mediante inserciones
  • Utilizar sentencias declarativas como UPDATE ... SET (updates ligeros) o ALTER TABLE ... UPDATE (mutaciones)

A su vez, dentro de cada enfoque hay varias formas posibles de actualizar/borrar datos, cada una con sus ventajas e inconvenientes. En general, el factor decisivo es siempre el n煤mero de datos que intervienen en la operaci贸n. Las sentencias declarativas resultan m谩s adecuadas actualizar/borrar un n煤mero reducido de filas y/o poco frecuentes

Mutaciones y rendimiento

Aunque sint谩cticamente las mutaciones pueden parecer similares a las operaciones SQL est谩ndar, su funcionamiento interno es fundamentalmente diferente. En lugar de modificar las filas inmediatamente, las mutaciones en ClickHouse son procesos as铆ncronos en segundo plano que reescriben partes completas de datos afectadas por el cambio. Este enfoque es necesario debido al modelo de almacenamiento inmutable y orientado a columnas de ClickHouse que, mail utilizado, puede provocar un elevado consumo de memoria y I/O

Cuando se emite una mutaci贸n, ClickHouse programa la creaci贸n de nuevas partes mutadas, dejando las partes originales intactas hasta que las nuevas est茅n listas. Una vez listas, las partes mutadas sustituyen de forma at贸mica a las originales. Sin embargo, dado que la operaci贸n reescribe partes completas, incluso un cambio menor (como la actualizaci贸n de una sola fila) puede dar lugar a reescrituras a gran escala. Adem谩s, las mutaciones siguen un orden total: se aplican primero a los datos modificados antes de que se ejecutara la mutaci贸n, mientras que los datos m谩s recientes no se ven afectados. No bloquean las inserciones, pero pueden solaparse con otras consultas en curso. Consecuentemente, una consulta SELECT que se ejecute durante una mutaci贸n puede leer una mezcla de partes mutadas y no mutadas, lo que puede dar lugar a vistas inconsistentes de los datos durante la ejecuci贸n

Como norma general, es conveniente evitar las mutaciones frecuentes o a gran escala, especialmente en tablas de gran volumen. En su lugar, es recomendable utilizar motores MergeTree como ReplacingMergeTree o CollapsingMergeTree que est谩n espec铆ficamente dise帽ados para gestionar las modificaciones de datos de forma eficiente. Si, pese a todo, fuera imperiosamente necesario es preceptivo monitorizar las mutaciones utilizando la tabla system.mutations y, llegado el caso, invocar KILL MUTATION si el proceso se bloquea o funciona incorrectamente

Modificaciones de datos en ClickHouse