- Permite escribir rápidamente estados de objetos que cambian continuamente.
- Elimina en segundo plano estados antiguos de los objetos. Esto reduce significativamente el volumen de almacenamiento.
VersionedCollapsingMergeTree cumple la misma función que CollapsingMergeTree, pero utiliza un algoritmo de colapso diferente que permite insertar los datos en cualquier orden con varios hilos. En particular, la columna Version ayuda a colapsar correctamente las filas incluso si se insertan en un orden incorrecto. En cambio, CollapsingMergeTree solo permite una inserción estrictamente consecutiva.
Crear una tabla
Parámetros del motor
Cláusulas de la consulta
VersionedCollapsingMergeTree, se requieren las mismas cláusulas que al crear una tabla MergeTree.
Collapsing
Datos
Sign al escribir la fila. Si Sign = 1, significa que la fila representa un estado de un objeto (llamémosla la fila de “estado”). Si Sign = -1, indica la anulación del estado de un objeto con los mismos atributos (llamémosla la fila de “cancelación”). Use también la columna Version, que debe identificar cada estado de un objeto con un número distinto.
Por ejemplo, queremos calcular cuántas páginas visitaron los usuarios en un sitio y cuánto tiempo permanecieron allí. En algún momento escribimos la siguiente fila con el estado de la actividad del usuario:
Sign.
La segunda fila contiene el estado actual.
Como solo necesitamos el último estado de la actividad del usuario, las filas
VersionedCollapsingMergeTree lo hace durante la fusión de las partes de datos.
Para averiguar por qué necesitamos dos filas para cada cambio, consulta Algorithm.
Notas sobre el uso
- El programa que escribe los datos debe recordar el estado de un objeto para poder cancelarlo. La cadena “Cancel” debe contener copias de los campos de la clave primaria, la versión de la cadena “estado” y el
Signopuesto. Esto aumenta el tamaño inicial del almacenamiento, pero permite escribir los datos con rapidez. - Los arrays largos y en crecimiento en las columnas reducen la eficiencia del motor debido a la carga de escritura. Cuanto más sencillos sean los datos, mayor será la eficiencia.
- Los resultados de
SELECTdependen en gran medida de la coherencia del historial de cambios de los objetos. Sé preciso al preparar los datos para insertarlos. Los datos incoherentes pueden producir resultados impredecibles, como valores negativos para métricas no negativas, como la profundidad de la sesión.
Algoritmo
Sign. El orden de las filas no importa.
Cuando ClickHouse inserta datos, ordena las filas por la clave primaria. Si la columna Version no forma parte de la clave primaria, ClickHouse la añade implícitamente al final de esta y la usa para la ordenación.
Selección de datos
SELECT con varios hilos y no puede predecir el orden de las filas en el resultado. Esto significa que se requiere agregación si se necesita obtener datos completamente “colapsados” de una tabla VersionedCollapsingMergeTree.
Para finalizar el colapso, escriba una consulta con una cláusula GROUP BY y funciones de agregado que tengan en cuenta el signo. Por ejemplo, para calcular la cantidad, use sum(Sign) en lugar de count(). Para calcular la suma de algo, use sum(Sign * x) en lugar de sum(x), y añada HAVING sum(Sign) > 0.
Los agregados count, sum y avg pueden calcularse de esta manera. El agregado uniq puede calcularse si un objeto tiene al menos un estado no colapsado. Los agregados min y max no pueden calcularse porque VersionedCollapsingMergeTree no guarda el historial de valores de los estados colapsados.
Si necesita extraer los datos con “colapso” pero sin agregación (por ejemplo, para comprobar si hay filas cuyos valores más recientes coinciden con ciertas condiciones), puede usar el modificador FINAL para la cláusula FROM. Este enfoque es ineficiente y no debe usarse con tablas grandes.
Ejemplo de uso
INSERT para crear dos partes de datos distintas. Si insertamos los datos con una sola consulta, ClickHouse crea una sola parte de datos y nunca realizará ningún merge.
Obtención de los datos:
INSERT. La consulta SELECT se ejecutó en dos hilos y el resultado muestra las filas en un orden aleatorio.
El colapso no ocurrió porque las partes de datos aún no se han fusionado. ClickHouse fusiona las partes de datos en algún momento desconocido que no podemos predecir.
Por eso necesitamos agregación:
FINAL en la cláusula FROM.