Tipos de datos
Numéricos
Float64 ofrece un
rango más amplio de valores, a costa de precisión.
En contraste, ClickHouse ofrece múltiples precisiones con signo y sin signo
para flotantes y enteros. Con ellas, puedes especificar de forma explícita
la precisión necesaria para los enteros a fin de optimizar el almacenamiento y el uso de memoria. Un
tipo Decimal, equivalente al tipo Number de Snowflake, también ofrece el doble de
precisión y escala, hasta 76 dígitos. Además de un valor Float64 similar,
ClickHouse también proporciona un Float32 para los casos en que la precisión es menos crítica y
la compresión es prioritaria.
Cadenas
VARCHAR de Snowflake almacena caracteres Unicode en UTF-8, lo que permite al usuario
especificar una longitud máxima. Esta longitud no afecta al almacenamiento ni al
rendimiento, ya que siempre se utiliza el número mínimo de bytes para almacenar una cadena, y
más bien solo impone restricciones útiles para las herramientas posteriores. Otros tipos, como
Text y NChar, son simplemente alias de este tipo. ClickHouse, por el contrario,
almacena todos los datos de cadena como bytes sin procesar con un tipo String
(no es necesario especificar una longitud), dejando la codificación en manos del usuario, con
funciones en tiempo de consulta
disponibles para distintas codificaciones. Remitimos al lector a “Opaque data argument”
para entender la motivación de este enfoque. Por tanto, la implementación de String en ClickHouse es más comparable
al tipo Binary de Snowflake. Tanto Snowflake
como ClickHouse
admiten “collation”, lo que permite a los usuarios definir cómo se ordenan y comparan las cadenas.
Tipos semiestructurados
VARIANT, OBJECT y ARRAY para datos semiestructurados.
ClickHouse ofrece los tipos equivalentes Variant,
Object (actualmente obsoleto en favor del tipo JSON nativo) y Array.
Además, ClickHouse cuenta con el
tipo JSON, que sustituye al ya obsoleto tipo Object('json') y destaca especialmente
por su rendimiento y eficiencia de almacenamiento en comparación con otros tipos JSON nativos.
ClickHouse también admite Tuples con nombre y arrays de Tuples
mediante el tipo Nested,
lo que permite a los usuarios mapear explícitamente estructuras anidadas. Esto permite aplicar codecs y
optimizaciones de tipos en toda la jerarquía, a diferencia de Snowflake, que
requiere que el usuario utilice los tipos OBJECT, VARIANT y ARRAY para el objeto
externo y no permite el tipado interno explícito.
Este tipado interno también simplifica las consultas sobre valores numéricos anidados en ClickHouse,
que no necesitan convertirse mediante cast y pueden usarse en definiciones de índices.
En ClickHouse, los codecs y los tipos optimizados también pueden aplicarse a subestructuras.
Esto ofrece la ventaja adicional de que la compresión con estructuras anidadas sigue siendo
excelente y comparable a la de los datos aplanados. En cambio, debido a la
imposibilidad de aplicar tipos específicos a las subestructuras, Snowflake recomienda aplanar
los datos para lograr una compresión óptima.
Snowflake también impone restricciones de tamaño
para estos tipos de datos.
Referencia de tipos
Por último, ClickHouse ofrece la capacidad única de almacenar el
estado de las funciones de agregación. Este
estado es específico de la implementación, pero permite almacenar el resultado de una agregación
y consultarlo posteriormente (con las funciones de combinación correspondientes). Normalmente, esta
funcionalidad se usa mediante una vista materializada y, como se muestra a continuación, permite
mejorar el rendimiento de consultas específicas con un coste de almacenamiento mínimo al
almacenar el resultado incremental de las consultas sobre los datos insertados (más detalles aquí).