¿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:
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 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
_part: