Types de données
Numériques
Float64 offre une plage de valeurs plus étendue, au prix d’une perte de précision.
À l’inverse, ClickHouse propose plusieurs niveaux de précision, signés et non signés, pour les flottants et les entiers. Avec ces types, vous pouvez spécifier explicitement la précision requise pour les entiers afin d’optimiser le stockage et la surcharge mémoire. Un type Decimal, équivalent au type Number de Snowflake, offre également une précision et une échelle deux fois plus élevées, jusqu’à 76 chiffres. En plus d’une valeur Float64 similaire, ClickHouse propose aussi un Float32 lorsque la précision est moins critique et que la compression est primordiale.
Chaînes
VARCHAR de Snowflake contient des caractères Unicode en UTF-8, ce qui permet à l’utilisateur de
spécifier une longueur maximale. Cette longueur n’a aucun impact sur le stockage ni sur
les performances : le nombre minimal d’octets est toujours utilisé pour stocker une chaîne, et
elle sert uniquement à imposer des contraintes utiles aux outils en aval. D’autres types, tels
que Text et NChar, sont simplement des alias de ce type. À l’inverse, ClickHouse
stocke toutes les données de chaîne sous forme d’octets bruts avec le type String
(aucune indication de longueur n’est requise), en laissant
à l’utilisateur la gestion de l’encodage, avec des
fonctions à l’exécution de la requête
disponibles pour différents encodages. Pour en comprendre la logique, nous renvoyons le lecteur à “Opaque data argument”.
Le type String de ClickHouse est donc, dans son implémentation, davantage comparable
au type Binary de Snowflake. Snowflake et ClickHouse
prennent tous deux en charge la « collation », ce qui permet aux utilisateurs de redéfinir la manière dont les chaînes sont triées et comparées.
Types semi-structurés
VARIANT, OBJECT et ARRAY pour les
données semi-structurées.
ClickHouse propose les types équivalents Variant,
Object (désormais obsolète au profit du type JSON natif) et Array.
En outre, ClickHouse propose le type JSON
qui remplace le type Object('json'), désormais obsolète, et qui offre d’excellentes
performances ainsi qu’une grande efficacité de stockage par rapport à d’autres types JSON natifs.
ClickHouse prend également en charge les Tuples nommés et les tableaux de Tuple
via le type Nested,
ce qui permet aux utilisateurs de mapper explicitement des structures imbriquées. Cela permet d’appliquer des codecs et des
optimisations de type à toute la hiérarchie, contrairement à Snowflake, qui
oblige l’utilisateur à utiliser les types OBJECT, VARIANT et ARRAY pour l’objet
externe et ne permet pas le typage interne explicite.
Ce typage interne simplifie également les requêtes sur les valeurs numériques imbriquées dans ClickHouse,
qui n’ont pas besoin d’être converties et peuvent être utilisées dans des définitions d’index.
Dans ClickHouse, des codecs et des types optimisés peuvent aussi être appliqués aux sous-structures.
Cela offre aussi l’avantage supplémentaire de maintenir une excellente compression
avec les structures imbriquées, comparable à celle des données aplaties. En revanche, du fait de
l’impossibilité d’appliquer des types spécifiques aux sous-structures, Snowflake recommande d’aplatir
les données pour obtenir une compression optimale.
Snowflake impose également des restrictions de taille
pour ces types de données.
Référence des types
Enfin, ClickHouse offre la capacité unique de stocker l’
état des fonctions d’agrégation. Cet
état est spécifique à l’implémentation, mais il permet de stocker le résultat d’une agrégation
pour l’interroger ultérieurement (avec les fonctions de fusion correspondantes). En général, cette
fonctionnalité est utilisée via une vue matérialisée et, comme illustré ci-dessous, permet
d’améliorer les performances de requêtes spécifiques avec un coût de stockage minimal en
stockant le résultat incrémental de requêtes sur des données insérées (plus de détails ici).