Particiones
PARTITION BY. Esta cláusula puede contener una expresión SQL sobre una o varias columnas, cuyo resultado determinará a qué partición se envía una fila.
Las partes de datos se asocian lógicamente (mediante un prefijo común en el nombre de la carpeta) con cada partición en disco y pueden consultarse de forma aislada. En el ejemplo siguiente, el esquema predeterminado otel_logs particiona por día mediante la expresión toDate(Timestamp). A medida que se insertan filas en ClickHouse, esta expresión se evaluará para cada fila y se dirigirá a la partición correspondiente si existe (si la fila es la primera de un día, se creará la partición).
otel_logs está particionada por día. Si se llena con el conjunto de datos estructurados de logs, contendrá datos de varios días:
otel_logs_archive, que usamos para almacenar los datos más antiguos. Los datos pueden moverse a esta tabla de forma eficiente por partición (esto es solo un cambio de metadatos).
INSERT INTO SELECT y reescribir los datos en la nueva tabla de destino.
Mover particionesMover particiones entre tablas requiere que se cumplan varias condiciones; entre ellas, que las tablas tengan la misma estructura, clave de partición, clave primaria e índices/proyecciones. Puedes encontrar notas detalladas sobre cómo especificar particiones en
ALTER DDL aquí.TTL aprovecha esta funcionalidad cuando se usa la configuración
ttl_only_drop_parts=1. Consulta Gestión de datos con TTL para más detalles.Aplicaciones
- Arquitecturas por niveles - mover datos entre niveles de almacenamiento (consulte Niveles de almacenamiento), lo que permite construir arquitecturas hot-cold.
- Eliminación eficiente - cuando los datos han alcanzado un TTL especificado (consulte Gestión de datos con TTL)
Rendimiento de las consultas
GROUP BY si los valores de cada partición son únicos. Sin embargo, en general, debe asegurarse de que la clave primaria esté optimizada y considerar el particionamiento como una técnica de optimización de consultas solo en casos excepcionales en los que los patrones de acceso se centren en un subconjunto específico y predecible de los datos; por ejemplo, particionar por día cuando la mayoría de las consultas se realizan sobre el último día. Consulte aquí para ver un ejemplo de este comportamiento.
Gestión de datos con TTL (Time-to-live)
TTL a nivel de tabla
ttl, por ejemplo.
h y se aseguren de que esto coincida con el período de particionado. Por ejemplo, si se particiona por día, asegúrese de que sea un múltiplo de días, p. ej., 24h, 48h, 72h. Esto garantizará automáticamente que se añada una cláusula TTL a la tabla, por ejemplo, si ttl: 96h.
TTLs programadosLos TTL no se aplican inmediatamente, sino según una programación, como se indicó antes. La configuración de tabla de MergeTree
merge_with_ttl_timeout establece el retraso mínimo, en segundos, antes de repetir una fusión con TTL de eliminación. El valor predeterminado es de 14400 segundos (4 horas). Pero ese es solo el retraso mínimo; puede pasar más tiempo hasta que se active una fusión TTL. Si el valor es demasiado bajo, se realizarán muchas fusiones fuera de programación que pueden consumir muchos recursos. El vencimiento de un TTL se puede forzar con el comando ALTER TABLE my_table MATERIALIZE TTL.ttl_only_drop_parts=1 ** (aplicada por el esquema predeterminado). Cuando esta configuración está habilitada, ClickHouse elimina una parte completa cuando todas sus filas han caducado. Eliminar partes completas en lugar de limpiar parcialmente las filas con TTL vencido (algo que se logra mediante mutaciones con un alto consumo de recursos cuando ttl_only_drop_parts=0) permite usar valores más cortos de merge_with_ttl_timeout y reducir el impacto en el rendimiento del sistema. Si los datos están particionados por la misma unidad con la que se aplica el vencimiento del TTL, por ejemplo, día, las partes contendrán de forma natural solo datos del intervalo definido. Esto garantizará que ttl_only_drop_parts=1 pueda aplicarse de forma eficiente.
TTL a nivel de columna
Body por si se añade algún metadato dinámico nuevo que no se haya extraído en el momento de la inserción, p. ej., una nueva etiqueta de Kubernetes. Después de un tiempo, p. ej., 1 mes, puede resultar evidente que estos metadatos adicionales no son útiles, lo que limita el valor de conservar la columna Body.
A continuación, mostramos cómo se puede eliminar la columna Body al cabo de 30 días.
Para especificar un TTL a nivel de columna, los usuarios deben definir su propio esquema. Esto no se puede especificar en el OTel collector.
Recompresión de datos
ZSTD(1) para los conjuntos de datos de observabilidad, puede probar distintos algoritmos de compresión o niveles de compresión más altos, como ZSTD(3). Además de poder especificarlo al crear el esquema, la compresión puede configurarse para que cambie después de un período determinado. Esto puede resultar adecuado si un codec o algoritmo de compresión mejora la compresión, pero empeora el rendimiento de las consultas. Esta contrapartida puede ser aceptable para datos más antiguos, que se consultan con menos frecuencia, pero no para datos recientes, que se usan con más frecuencia en las investigaciones.
A continuación se muestra un ejemplo, en el que comprimimos los datos con ZSTD(3) después de 4 días en lugar de eliminarlos.
Evaluar el rendimientoRecomendamos a los usuarios evaluar siempre el impacto en el rendimiento de la inserción y las consultas de los distintos niveles y algoritmos de compresión. Por ejemplo, los códecs delta pueden ser útiles para comprimir marcas de tiempo. Sin embargo, si forman parte de la clave primaria, el rendimiento del filtrado puede verse afectado.
Niveles de almacenamiento
No es relevante para ClickHouse CloudClickHouse Cloud usa una sola copia de los datos respaldada por S3, con cachés de nodo sobre SSD. Por lo tanto, los niveles de almacenamiento no son necesarios en ClickHouse Cloud.
ALTER TABLE MOVE PARTITION, el movimiento de datos entre volúmenes también puede controlarse mediante TTL. Puede encontrar un ejemplo completo aquí.
Gestión de cambios de esquema
Usar valores predeterminados
valores DEFAULT“. El valor predeterminado especificado se usará si no se indica durante el INSERT.
Los cambios en el esquema pueden realizarse antes de modificar la lógica de transformación de cualquier vista materializada o la configuración del OTel collector, lo que permite que se envíen estas nuevas columnas.
Una vez modificado el esquema, puede reconfigurar los OTel collectors. Suponiendo que los usuarios sigan el proceso recomendado descrito en “Extracción de estructura con SQL”, en el que los OTel collectors envían sus datos a un motor de tabla Null con una vista materializada encargada de extraer el esquema de destino y enviar los resultados a una tabla de destino para su almacenamiento, la vista puede modificarse mediante la sintaxis ALTER TABLE ... MODIFY QUERY. Supongamos que tenemos la siguiente tabla de destino con su vista materializada correspondiente (similar a la utilizada en “Extracción de estructura con SQL”) para extraer el esquema de destino de los logs estructurados de OTel:
Size de LogAttributes. Podemos añadirla a nuestro esquema con un ALTER TABLE, especificando el valor por defecto:
size en LogAttributes (será 0 si no existe). Esto significa que las consultas que acceden a esta columna en filas donde no se ha insertado el valor deben acceder al Map y, por lo tanto, serán más lentas. También podríamos especificarlo fácilmente como una constante, p. ej., 0, lo que reduce el coste de las consultas posteriores sobre las filas que no tienen ese valor. Al consultar esta tabla, se observa que el valor se rellena como se espera a partir del Map:
ALTER TABLE, como se muestra a continuación:
Size rellenada en el momento de la inserción.
Crear tablas nuevas
ALTER TABLE MODIFY QUERY mencionado anteriormente. Con este enfoque, puedes versionar tus tablas, por ejemplo, otel_logs_v3.
Este enfoque deja a los usuarios con varias tablas para consultar. Para consultar datos en varias tablas, puedes usar la función merge, que acepta patrones comodín para el nombre de la tabla. A continuación, mostramos esto consultando una v2 y una v3 de la tabla otel_logs:
merge y exponer a los usuarios finales una tabla que combine varias tablas, se puede utilizar el motor de tabla Merge. Lo mostramos a continuación:
EXCHANGE para tablas. Por ejemplo, para añadir una tabla v4, podemos crear una nueva tabla e intercambiarla de forma atómica con la versión anterior.