Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Motor de tabla CoalescingMergeTree

Este motor hereda de MergeTree. La principal diferencia está en cómo se fusionan las partes de datos: en las tablas CoalescingMergeTree, ClickHouse sustituye todas las filas con la misma clave primaria (o, más precisamente, la misma clave de ordenación) por una sola fila que contiene, para cada columna, el valor distinto de NULL más reciente.

Esto permite realizar upserts a nivel de columna, lo que significa que puedes actualizar solo columnas concretas en lugar de filas completas.

CoalescingMergeTree está pensado para usarse con tipos Nullable en columnas que no forman parte de la clave. Si las columnas no son Nullable, el comportamiento es el mismo que con ReplacingMergeTree.

Crear una tabla

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = CoalescingMergeTree([columns])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

Para obtener información sobre los parámetros de la solicitud, consulte la descripción de la solicitud.

Parámetros de CoalescingMergeTree

Columnas

columns - Opcional. Una tupla con los nombres de las columnas cuyos valores se combinarán. Las columnas proporcionadas no deben formar parte de la partición ni de la clave de ordenación. Si no se especifica columns, ClickHouse combina los valores de todas las columnas que no forman parte de la clave de ordenación.

Cláusulas de consulta

Al crear una tabla CoalescingMergeTree, se requieren las mismas cláusulas que al crear una tabla MergeTree.

Método obsoleto para crear una tabla
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE [=] CoalescingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [columns])

Todos los parámetros, excepto columns, tienen el mismo significado que en MergeTree.

  • columns — tupla con los nombres de las columnas cuyos valores se sumarán. Parámetro opcional. Para más información, consulte el texto anterior.

Ejemplo de uso

Considere la siguiente tabla:

CREATE TABLE test_table
(
    key UInt64,
    value_int Nullable(UInt32),
    value_string Nullable(String),
    value_date Nullable(Date)
)
ENGINE = CoalescingMergeTree()
ORDER BY key

Inserta datos en ella:

INSERT INTO test_table VALUES(1, NULL, NULL, '2025-01-01'), (2, 10, 'test', NULL);
INSERT INTO test_table VALUES(1, 42, 'win', '2025-02-01');
INSERT INTO test_table(key, value_date) VALUES(2, '2025-02-01');

El resultado será así:

SELECT * FROM test_table ORDER BY key;
┌─key─┬─value_int─┬─value_string─┬─value_date─┐
│   1 │        42 │ win          │ 2025-02-01 │
│   1 │      ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ         │ 2025-01-01 │
│   2 │      ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ         │ 2025-02-01 │
│   2 │        10 │ test         │       ᴺᵁᴸᴸ │
└─────┴───────────┴──────────────┴────────────┘

Consulta recomendada para obtener el resultado correcto y definitivo:

SELECT * FROM test_table FINAL ORDER BY key;
┌─key─┬─value_int─┬─value_string─┬─value_date─┐
│   1 │        42 │ win          │ 2025-02-01 │
│   2 │        10 │ test         │ 2025-02-01 │
└─────┴───────────┴──────────────┴────────────┘

Usar el modificador FINAL obliga a ClickHouse a aplicar la lógica de fusión en tiempo de consulta, lo que garantiza que obtengas el valor "más reciente" correcto y consolidado para cada columna. Este es el método más seguro y preciso al consultar una tabla CoalescingMergeTree.

Agregación de elementos de Tuple

Cuando la configuración allow_tuple_element_aggregation está habilitada, las columnas Tuple se aplanan de forma recursiva para que cada elemento hoja participe en la coalescencia de manera independiente. Esto permite almacenar varios campos en una sola columna Tuple y que se coaleszcan por elemento durante las fusiones; cada subcolumna Nullable conserva de manera independiente el valor distinto de NULL más reciente.

A las subcolumnas aplanadas se les aplican las mismas reglas que a las columnas normales:

  • Las subcolumnas que pertenecen a un Tuple de la clave de ordenación o de la clave de partición se excluyen de la coalescencia.
  • Si se especifica columns, solo se coalescen las subcolumnas de las columnas Tuple incluidas en la lista.
CREATE TABLE coalescing_tuples
(
    key UInt64,
    data Tuple(
        value_a Nullable(UInt64),
        value_b Nullable(String),
        nested Tuple(
            value_c Nullable(UInt64)
        )
    )
) ENGINE = CoalescingMergeTree()
ORDER BY key
SETTINGS allow_tuple_element_aggregation = 1;

INSERT INTO coalescing_tuples VALUES (1, (100, NULL, (NULL)));
INSERT INTO coalescing_tuples VALUES (1, (NULL, 'hello', (42)));

SELECT key, data.value_a, data.value_b, data.nested.value_c FROM coalescing_tuples FINAL;
┌─key─┬─data.value_a─┬─data.value_b─┬─data.nested.value_c─┐
│   1 │          100 │ hello        │                  42 │
└─────┴──────────────┴──────────────┴─────────────────────┘
Navigation