Pour comprendre pourquoi ClickHouse compresse si bien les données, nous vous recommandons de lire cet article. En bref, notre base de données orientée colonnes écrit les valeurs par colonne. Lorsque ces valeurs sont triées, les valeurs identiques se retrouvent côte à côte, et les algorithmes de compression tirent parti des motifs contigus dans les données. De plus, ClickHouse dispose de codecs et de types de données granulaires qui vous permettent d’affiner encore plus facilement la compression.La compression dans ClickHouse dépend de 3 facteurs principaux :
- La clé de tri
- Les types de données
- Les codecs utilisés
Choisissez le bon type de données pour optimiser la compression
posts :
posts- Un schéma non optimisé en termes de types, sans clé de tri.posts_v3- Un schéma optimisé en termes de types, avec le type et la taille en bits appropriés pour chaque colonne, et la clé de tri(PostTypeId, toDate(CreationDate), CommentCount).
posts, sans clé de tri.
Remarque sur les parts `compact` et `wide`
Remarque sur les parts `compact` et `wide`
Si vous voyez des valeurs
compressed_size ou uncompressed_size égales à 0, cela peut venir du fait que le type des
parts est compact et non wide (voir la description de part_type dans system.parts).
Le format des parts est contrôlé par les paramètres min_bytes_for_wide_part
et min_rows_for_wide_part. Cela signifie que si les données insérées
produisent une part qui ne dépasse pas les valeurs des paramètres ci-dessus, la part sera au format compact plutôt
qu’au format wide, et vous ne verrez pas les valeurs de compressed_size ou uncompressed_size.Pour le démontrer :Requête
réponse
La requête ci-dessus s’appuie sur la table columns de la base de données système. Cette base de données, gérée par ClickHouse, regorge d’informations utiles, des métriques de performance des requêtes aux logs d’arrière-plan du cluster. Nous recommandons “System Tables and a Window into the Internals of ClickHouse” ainsi que les articles associés[1][2] pour les lecteurs curieux.
Pour résumer la taille totale de la table, nous pouvons simplifier la requête ci-dessus :
posts_v3, la table dont le type et la clé de tri ont été optimisés, nous constatons une réduction significative des tailles non compressée et compressée.
Body, Title, Tags et CreationDate, obtenus en ordonnant les données avant la compression et en utilisant les types appropriés.
Choisir le bon codec de compression pour une colonne
Voir ici pour plus d’options.
Ci-dessous, nous spécifions le codec
Delta pour Id, ViewCount et AnswerCount, en partant de l’hypothèse qu’ils seront corrélés linéairement avec la clé de tri et devraient donc bénéficier de l’encodage Delta.
Compression dans ClickHouse Cloud
ZSTD (avec une valeur par défaut de 1). Bien que la vitesse de compression de cet algorithme puisse varier selon le niveau de compression (plus il est élevé, plus la compression est lente), il présente l’avantage d’être toujours rapide à la décompression (avec une variation d’environ 20 %) et de pouvoir être parallélisé. Nos tests historiques indiquent également que cet algorithme est souvent suffisamment efficace et peut même surpasser LZ4 combiné à un codec. Il fonctionne bien avec la plupart des types de données et des distributions de données ; il constitue donc un choix par défaut judicieux pour un usage général, ce qui explique pourquoi notre compression initiale est déjà excellente, même sans optimisation.