Descripción
CollapsingMergeTree hereda de MergeTree
y añade lógica para colapsar filas durante el proceso de fusión.
El motor de tabla CollapsingMergeTree elimina (colapsa) de forma asíncrona
pares de filas si todos los campos de la clave de ordenación (ORDER BY) son equivalentes, excepto el campo especial Sign,
que puede tener los valores 1 o -1.
Las filas que no tienen una pareja con el valor opuesto de Sign se conservan.
Para obtener más información, consulte la sección colapsado de este documento.
Este motor puede reducir significativamente el volumen de almacenamiento,
lo que, en consecuencia, aumenta la eficiencia de las consultas
SELECT.Parámetros
Sign,
tienen el mismo significado que en MergeTree.
Sign— El nombre de una columna con el tipo de fila, donde1es una fila de estado y-1es una fila de cancelación. Tipo: Int8.
Crear una tabla
- Para ver una descripción de los parámetros de consulta, consulte la descripción de la consulta.
- Al crear una tabla
CollapsingMergeTree, se requieren las mismas cláusulas de consulta que al crear una tablaMergeTree.
colapsado
Datos
Sign.
- Si
Sign=1, significa que la fila es una fila de “estado”: una fila que contiene campos que representan un estado válido actual. - Si
Sign=-1, significa que la fila es una fila de “cancelación”: una fila utilizada para cancelar el estado de un objeto con los mismos atributos.
Sign.
La segunda fila anterior contiene el estado actual.
Como solo necesitamos el último estado de la actividad del usuario, la fila original de “estado” y la fila de “cancelación”
que insertamos pueden eliminarse, como se muestra a continuación, colapsando el estado no válido (antiguo) de un objeto:
CollapsingMergeTree lleva a cabo precisamente este comportamiento de collapsing durante la fusión de las partes de datos.
La razón por la que se necesitan dos filas para cada cambio
se explica con más detalle en el apartado Algoritmo.
- El programa que escribe los datos debe recordar el estado de un objeto para poder cancelarlo. La fila de “cancelación” debe contener copias de los campos de la clave de ordenación del “estado” y el
Signopuesto. Esto aumenta el tamaño inicial del almacenamiento, pero permite escribir los datos rápidamente. - Los arrays largos y en crecimiento en las columnas reducen la eficiencia del engine debido al aumento de la carga de escritura. Cuanto más sencillos sean los datos, mayor será la eficiencia.
- Los resultados de
SELECTdependen en gran medida de la consistencia del historial de cambios del objeto. Sea preciso al preparar los datos para insertarlos. Los datos inconsistentes pueden producir resultados impredecibles. Por ejemplo, valores negativos para métricas no negativas, como la profundidad de la sesión.
Algoritmo
ORDER BY) se reduce a no más de dos filas:
la fila de estado con Sign = 1 y la fila de cancelación con Sign = -1.
En otras palabras, en ClickHouse las entradas se colapsan.
Para cada parte de datos resultante, ClickHouse guarda:
Además, cuando hay al menos dos filas de estado más que filas de cancelación
o al menos dos filas de cancelación más que filas de estado, la fusión continúa.
Sin embargo, ClickHouse considera esta situación un error lógico y lo registra en el registro del servidor.
Este error puede producirse si los mismos datos se insertan más de una vez.
Por lo tanto, el colapsado no debería cambiar los resultados del cálculo de estadísticas.
Los cambios se colapsan gradualmente, de modo que al final solo queda el último estado de casi todos los objetos.
La columna
Sign es necesaria porque el algoritmo de fusión no garantiza
que todas las filas con la misma clave de ordenación estén en la misma parte de datos resultante ni siquiera en el mismo servidor físico.
ClickHouse procesa las consultas SELECT con múltiples hilos y no puede predecir el orden de las filas en el resultado.
La agregación es necesaria si se necesita obtener datos completamente “colapsados” de la tabla CollapsingMergeTree.
Para completar el colapsado, escriba una consulta con la cláusula GROUP BY y funciones de agregación 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) junto con HAVING sum(Sign) > 0 en lugar de sum(x),
como en el ejemplo a continuación.
Las funciones de agregación count, sum y avg pueden calcularse de esta forma.
La función de agregación uniq puede calcularse si un objeto tiene al menos un estado no colapsado.
Las funciones de agregación min y max no pueden calcularse
porque CollapsingMergeTree no conserva el historial de los estados colapsados.
Si necesita extraer datos sin agregación
(por ejemplo, para comprobar si existen filas cuyos valores más recientes coinciden con ciertas condiciones),
puede usar el modificador
FINAL para la cláusula FROM. Este fusionará los datos antes de devolver el resultado.
Para CollapsingMergeTree, solo se devuelve la fila de estado más reciente para cada clave.Ejemplos
Ejemplo de uso
UAct con CollapsingMergeTree:
INSERT para crear dos partes de datos diferentes.
Si insertamos los datos con una sola consulta, ClickHouse crea solo una parte de datos y no realizará ninguna fusión.
INSERT, creamos dos partes de datos.
La consulta SELECT se ejecutó en dos hilos y obtuvimos un orden aleatorio de las filas.
Sin embargo, el collapsing no se produjo porque todavía no se había realizado ninguna fusión de las partes de datos,
y ClickHouse fusiona las partes de datos en segundo plano en un momento desconocido que no podemos predecir.
Por lo tanto, necesitamos una agregación,
que realizamos con la función de agregación sum
y la cláusula HAVING:
FINAL en la cláusula FROM.
Esta forma de seleccionar los datos es menos eficiente y no se recomienda para grandes volúmenes de datos analizados (millones de filas).
Ejemplo de otro enfoque
Sign.
Para este ejemplo, utilizaremos los datos de muestra que aparecen a continuación:
PageViews y Duration para poder almacenar valores negativos.
Por lo tanto, cambiamos el tipo de estas columnas de UInt8 a Int16 cuando creamos nuestra tabla UAct con
collapsingMergeTree: