El tipo de columna JSON está listo para producción a partir de ClickHouse 25.3+. No se recomienda usar versiones anteriores en producción.
Decisión rápida
- Si cada campo tiene un tipo conocido y estable, y el esquema rara vez cambia → Columnas tipadas
- Si la mayoría de los campos son estables, pero alguna parte es dinámica o impredecible → Híbrido (columnas tipadas + JSON)
- Si toda la estructura es dinámica, con claves que aparecen y desaparecen entre registros → Columna JSON nativa
- Si los campos dinámicos son pares clave-valor con un tipo de valor uniforme (p. ej., tags de texto, métricas numéricas)
→
Mapen lugar de JSON - Si solo se almacena y recupera el blob JSON sin consultas a nivel de campo → Almacenamiento opaco en String
No confunda el formato JSON con el tipo de columna JSON. Puede insertar datos en formato JSON (mediante
JSONEachRow, etc.) en columnas tipadas sin usar en absoluto el tipo de columna JSON. La decisión aquí se refiere a los tipos de columna, no a los formatos de entrada.Detalles del enfoque
Columnas tipadas
Array, Tuple y Nested.
Consideraciones: Los cambios de esquema requieren ALTER TABLE. Los campos inesperados se descartan silenciosamente al insertar, a menos que se actualice el esquema.
Configuración, verificación y aspectos a tener en cuenta
Configuración, verificación y aspectos a tener en cuenta
ConfiguraciónVerificaciónTen en cuenta
- Si insertas datos JSON con
JSONEachRowy el JSON contiene campos que no están en el esquema, ClickHouse los descarta silenciosamente de forma predeterminada. Estableceinput_format_skip_unknown_fieldsen0si quieres que se produzcan errores.
Híbrido (columnas tipadas + JSON)
Configuración, verificación y aspectos a tener en cuenta
Configuración, verificación y aspectos a tener en cuenta
ConfiguraciónVerificaciónTenga en cuenta
- Use indicaciones de tipo en las rutas JSON que conozca de antemano. Estas indicaciones evitan la discriminator column y almacenan la ruta como una columna tipada normal, con el mismo rendimiento y sin sobrecoste.
- Use
SKIPoSKIP REGEXPpara las rutas que nunca consulte (metadatos de depuración, ID internos de tracing) para ahorrar almacenamiento y reducir el número de subcolumnas. - Ajuste
max_dynamic_pathsde forma proporcional al número de rutas distintas que realmente consulta. El valor predeterminado (1024) funciona en la mayoría de los casos. Redúzcalo si su sección dinámica es limitada. - No establezca
max_dynamic_pathspor encima de 10,000. Los valores altos aumentan el consumo de recursos y reducen la eficiencia.
Claves con puntosLas claves con puntos (por ejemplo,
http.status_code) se tratan como rutas anidadas de forma predeterminada, por lo que {"http.status_code": 200} se almacena igual que {"http": {"status_code": 200}}. Esto es habitual con los atributos de OTel. Use indicaciones de tipo para controlar cómo se almacenan las rutas con puntos, o habilite json_type_escape_dots_in_keys (25.8+).Columna JSON nativa
Configuración, verificación y aspectos a tener en cuenta
Configuración, verificación y aspectos a tener en cuenta
ConfiguraciónUsa el formato Ten en cuenta
JSONAsObject al insertar documentos JSON completos en una columna JSON. Trata cada línea de entrada como un objeto JSON completo asignado a la columna.Verificación- Sin indicaciones de tipo, ClickHouse infiere los tipos de cada ruta a partir de los primeros valores que encuentra. Si
scorellega como"10"(cadena) en un registro y como10(entero) en otro, la ruta obtiene una columna discriminadora y las consultas se vuelven más lentas. Añade indicaciones para las rutas con tipos conocidos. - Cuando el número de rutas supera
max_dynamic_paths, los valores desbordados se mueven a una estructura de datos compartida, lo que reduce el rendimiento de las consultas. Supervísalo conJSONDynamicPaths()y mantén el límite por debajo de 10.000. - Cada ruta dinámica admite hasta
max_dynamic_types(32 de forma predeterminada) tipos de datos distintos. Si una sola ruta supera este valor, los tipos adicionales pasan al almacenamiento variant compartido. Esto rara vez importa, salvo que tus datos tengan tipos muy inconsistentes para el mismo campo.
Almacenamiento opaco en String
JSONExtract), lo cual es lento a gran escala.
Configuración, verificación y aspectos a tener en cuenta
Configuración, verificación y aspectos a tener en cuenta
ConfiguraciónVerificaciónTen en cuenta
- Si los requisitos cambian y más adelante necesitas consultas a nivel de campo, tendrás que crear una tabla nueva con columnas tipadas o columnas JSON y rellenarla con los datos históricos. Si existe alguna posibilidad de que consultes campos individuales, empieza mejor con el enfoque híbrido.
- Las funciones
JSONExtractanalizan la cadena en cada consulta. Es aceptable para exploración ad hoc, pero no para dashboards de producción ni workloads con QPS alto. - Considera códecs de compresión (
ZSTD) en la columna String si los payloads JSON son grandes; comprime bien.
Comparación
Cuando conviene más usar Map
Map(String, T) es más sencillo y eficiente que una columna JSON. Algunos ejemplos habituales son: etiquetas de texto (Map(String, String)), métricas numéricas (Map(String, Float64)) o feature flags (Map(String, Bool)).
Map admite el filtrado a nivel de clave (tags['env'] = 'prod'), requiere menos almacenamiento que JSON y evita la sobrecarga de las subcolumnas del tipo JSON. Ten en cuenta que las búsquedas por clave recorren el mapa de forma lineal de manera predeterminada; esto está bien para conjuntos pequeños de etiquetas, pero para mapas con más de 100 claves, considera la serialización with_buckets. Usa JSON cuando los valores tengan tipos mixtos o la estructura tenga anidamiento; usa Map cuando sean pares clave-valor planos con un tipo de valor uniforme.
- Usa JSON cuando corresponda — cuándo usar el tipo de columna JSON frente a otras alternativas
- Referencia sobre el tipo de datos JSON — sintaxis completa para indicaciones de tipo, SKIP, max_dynamic_paths y funciones de introspección
- Selección de tipos de datos — guía general para seleccionar tipos de datos
- Un nuevo y potente tipo de datos JSON para ClickHouse — análisis en profundidad de la arquitectura de almacenamiento del tipo JSON
- Referencia de formatos JSON — formatos de entrada/salida para datos JSON (JSONEachRow, JSONAsObject, etc.)