Saltar al contenido principal

¿Qué son las partes de tabla en ClickHouse?


Los datos de cada tabla de la familia de motores MergeTree de ClickHouse se organizan en disco como una colección de data parts inmutables. Para ilustrarlo, usamos esta tabla (adaptada del conjunto de datos de precios de viviendas del Reino Unido) que registra la fecha, la localidad, la calle y el precio de las propiedades vendidas en el Reino Unido:
CREATE TABLE uk.uk_price_paid_simple
(
    date Date,
    town LowCardinality(String),
    street LowCardinality(String),
    price UInt32
)
ENGINE = MergeTree
ORDER BY (town, street);
Puede consultar esta tabla en nuestro Playground de SQL de ClickHouse. Se crea una parte de datos cada vez que se inserta un conjunto de filas en la tabla. El siguiente diagrama lo ilustra:
Cuando un servidor de ClickHouse procesa la inserción de ejemplo con 4 filas (por ejemplo, mediante una sentencia INSERT INTO) ilustrada en el diagrama anterior, realiza varios pasos: Ordenación: Las filas se ordenan según la clave de ordenación de la tabla (town, street) y se genera un índice primario disperso para las filas ordenadas. División: Los datos ordenados se dividen en columnas. Compresión: Cada columna se comprime. Escritura en disco: Las columnas comprimidas se guardan como archivos binarios de columna dentro de un nuevo directorio que representa la parte de datos de la inserción. El índice primario disperso también se comprime y se almacena en el mismo directorio. Según el motor específico de la tabla, pueden producirse transformaciones adicionales junto con la ordenación. Las partes de datos son autónomas e incluyen todos los metadatos necesarios para interpretar su contenido sin requerir un catálogo central. Además del índice primario disperso, las partes contienen metadatos adicionales, como índices de omisión de datos secundarios, estadísticas de columnas, checksums, índices min-max (si se usa particionamiento) y más.

Fusiones de partes

Para gestionar el número de partes por tabla, un proceso de fusión en segundo plano combina periódicamente las partes más pequeñas en otras más grandes hasta que alcanzan un tamaño comprimido configurable (normalmente, ~150 GB). Las partes fusionadas se marcan como inactivas y se eliminan tras un intervalo de tiempo configurable. Con el tiempo, este proceso crea una estructura jerárquica de partes fusionadas, de ahí que se llame tabla MergeTree:
Para minimizar el número de partes iniciales y la sobrecarga de las fusiones, se recomienda a los clientes de base de datos insertar tuplas en bloque, por ejemplo, 20.000 filas de una sola vez, o usar el modo de inserción asíncrona, en el que ClickHouse almacena en un búfer filas de varias operaciones INSERT dirigidas a la misma tabla y crea una nueva parte solo cuando el tamaño del búfer supera un umbral configurable o vence un tiempo de espera.

Supervisión de las partes de tabla

Puede consultar la lista de todas las partes activas que existen actualmente en nuestra tabla de ejemplo mediante la columna virtual _part:
SELECT _part
FROM uk.uk_price_paid_simple
GROUP BY _part
ORDER BY _part ASC;
   ┌─_part───────┐
1. │ all_0_5_1   │
2. │ all_12_17_1 │
3. │ all_18_23_1 │
4. │ all_6_11_1  │
   └─────────────┘
La consulta anterior recupera los nombres de los directorios en disco; cada directorio representa una parte de datos activa de la tabla. Los componentes de estos nombres de directorio tienen significados específicos, documentados aquí para quienes quieran profundizar más. Como alternativa, ClickHouse registra la información de todas las partes de todas las tablas en la tabla del sistema system.parts, y la siguiente consulta devuelve para nuestra tabla de ejemplo anterior la lista de todas las partes activas en este momento, su nivel de fusión y el número de filas almacenadas en esas partes:
SELECT
    name,
    level,
    rows
FROM system.parts
WHERE (database = 'uk') AND (`table` = 'uk_price_paid_simple') AND active
ORDER BY name ASC;
   ┌─name────────┬─level─┬────rows─┐
1. │ all_0_5_1   │     1 │ 6368414 │
2. │ all_12_17_1 │     1 │ 6442494 │
3. │ all_18_23_1 │     1 │ 5977762 │
4. │ all_6_11_1  │     1 │ 6459763 │
   └─────────────┴───────┴─────────┘
El nivel de fusión aumenta en uno con cada fusión adicional de la parte. Un nivel de 0 indica que se trata de una parte nueva que aún no se ha fusionado.
Última modificación el 10 de junio de 2026