En la mayoría de los casos, no necesita una clave de partición y, en la mayoría de los demás, tampoco necesita una clave de partición con una granularidad mayor que la mensual, salvo en casos de uso de observabilidad, donde la partición por día es habitual.Nunca debe usar una partición demasiado granular. No particione sus datos por identificadores o nombres de cliente. En su lugar, haga que el identificador o nombre del cliente sea la primera columna de la expresión
ORDER BY.PARTITION BY expr al crear una tabla. La clave de partición puede ser cualquier expresión basada en las columnas de la tabla. Por ejemplo, para especificar el particionamiento por mes, use la expresión toYYYYMM(date_column):
La fusión solo funciona con partes de datos que tienen el mismo valor para la expresión de particionamiento. Esto significa que no debe crear particiones demasiado granulares (más de aproximadamente mil particiones). De lo contrario, la consulta
SELECT tendrá un rendimiento deficiente debido a un número excesivamente grande de archivos en el sistema de archivos y de descriptores de archivo abiertos.visits con particionamiento por mes. Realicemos la consulta SELECT sobre la tabla system.parts:
partition contiene los nombres de las particiones. En este ejemplo hay dos particiones: 201901 y 201902. Puede usar el valor de esta columna para especificar el nombre de la partición en las consultas ALTER … PARTITION.
La columna name contiene los nombres de las partes de datos de la partición. Puede usar esta columna para especificar el nombre de la parte en la consulta ALTER ATTACH PART.
Desglosemos el nombre de la parte: 201901_1_9_2_11:
201901es el nombre de la partición.1es el número mínimo del bloque de datos.9es el número máximo del bloque de datos.2es el nivel del fragmento (la profundidad del árbol de fusiones del que se forma).11es la versión de la mutación (si la parte fue mutada)
Las partes de las tablas de tipo antiguo tienen el siguiente nombre:
20190117_20190123_2_2_0 (fecha mínima - fecha máxima - número mínimo de bloque - número máximo de bloque - nivel).active muestra el estado de la parte. 1 está activa; 0, inactiva. Las partes inactivas son, por ejemplo, partes de origen que permanecen tras fusionarse en una parte más grande. Las partes de datos corruptas también se indican como inactivas.
Como puede ver en el ejemplo, hay varias partes separadas de la misma partición (por ejemplo, 201901_1_3_1 y 201901_1_9_2). Esto significa que esas partes aún no se han fusionado. ClickHouse fusiona periódicamente las partes de datos insertadas, aproximadamente 15 minutos después de la inserción. Además, puede realizar una fusión no programada mediante la consulta OPTIMIZE. Ejemplo:
/var/lib/clickhouse/data/<database>/<table>/. Por ejemplo:
detached contiene partes que se desvincularon de la tabla mediante la consulta DETACH. Las partes corruptas también se mueven a este directorio en lugar de eliminarse. El servidor no utiliza las partes del directorio detached. Puede añadir, eliminar o modificar los datos de este directorio en cualquier momento; el servidor no tendrá constancia de ello hasta que ejecute la consulta ATTACH.
Tenga en cuenta que, mientras el servidor está en funcionamiento, no puede cambiar manualmente el conjunto de partes ni sus datos en el sistema de archivos, ya que el servidor no tendrá constancia de ello. En las tablas no replicadas, puede hacerlo cuando el servidor está detenido, pero no se recomienda. En las tablas replicadas, el conjunto de partes no puede modificarse en ningún caso.
ClickHouse le permite realizar operaciones con las particiones: eliminarlas, copiarlas de una tabla a otra o crear una copia de seguridad. Consulte la lista de todas las operaciones en la sección Manipulación de particiones y partes.
Optimización de Group By mediante la clave de partición
El rendimiento de una consulta de este tipo depende de la estructura de la tabla. La optimización está habilitada de forma predeterminada desde la versión 26.7; las heurísticas de tiempo de ejecución la omiten automáticamente cuando la estructura de las particiones no es favorable, en concreto, cuando hay muy pocas particiones (menos de
max_threads / 2), demasiadas particiones (más de max_number_of_partitions_for_independent_aggregation) o los tamaños de las particiones están muy sesgados (la partición más grande contiene más filas que el doble del número total de filas dividido por max_threads). La lista siguiente describe, en general, los factores de la estructura que favorecen un buen rendimiento; de ellos, solo el número de particiones y el sesgo de tamaño son aplicados por las heurísticas de tiempo de ejecución.- el número de particiones implicadas en la consulta debe ser suficientemente grande (más de
max_threads / 2); de lo contrario, la consulta no aprovechará completamente la máquina - las particiones no deben ser demasiado pequeñas, para evitar que el procesamiento por lotes se degrade a un procesamiento fila por fila
- las particiones deben tener tamaños comparables, para que todos los hilos realicen aproximadamente la misma cantidad de trabajo
Se recomienda aplicar alguna función hash a las columnas de la cláusula
partition by para distribuir los datos de manera uniforme entre las particiones.allow_aggregate_partitions_independently- controla si se habilita el uso de la optimizaciónforce_aggregate_partitions_independently- fuerza su uso cuando es aplicable desde el punto de vista de la corrección, pero la lógica interna que evalúa su conveniencia lo deshabilitamax_number_of_partitions_for_independent_aggregation- límite estricto del número máximo de particiones que puede tener la tabla