Skip to main content
L’un des secrets des performances des requêtes ClickHouse réside dans la compression. Moins de données sur disque signifie moins d’E/S, donc des requêtes et des insertions plus rapides. Dans la plupart des cas, le surcoût en CPU d’un algorithme de compression est largement compensé par la réduction des E/S. Améliorer la compression des données doit donc être la première priorité lorsque vous cherchez à accélérer les requêtes ClickHouse.
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
Tous ces éléments sont configurés via le schéma.

Choisissez le bon type de données pour optimiser la compression

Prenons le jeu de données Stack Overflow comme exemple. Comparons les statistiques de compression des schémas suivants pour la table 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).
À l’aide des requêtes suivantes, nous pouvons mesurer la taille compressée et non compressée actuelle de chaque colonne. Examinons la taille du schéma initial posts, sans clé de tri.
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
Nous affichons ici à la fois la taille compressée et la taille non compressée. Toutes deux sont importantes. La taille compressée correspond à ce que nous devrons lire sur disque — et c’est ce que nous cherchons à minimiser pour améliorer les performances des requêtes (ainsi que le coût de stockage). Ces données devront ensuite être décompressées avant d’être lues. La taille non compressée dépend ici du type de données utilisé. Réduire cette taille permet de diminuer la surcharge mémoire des requêtes ainsi que la quantité de données à traiter, ce qui améliore l’utilisation des caches et, au final, le temps d’exécution des requêtes.
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 :
En répétant cette requête pour 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.
La ventilation complète des colonnes montre des gains considérables pour les colonnes 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

Avec les codecs de compression de colonne, nous pouvons modifier l’algorithme (et ses paramètres) utilisé pour encoder et compresser chaque colonne. Les encodages et la compression fonctionnent de manière légèrement différente, tout en poursuivant le même objectif : réduire la taille des données. Les encodages appliquent une transformation aux données, en modifiant les valeurs à l’aide d’une fonction qui exploite les propriétés du type de données. À l’inverse, la compression utilise un algorithme générique pour compresser les données au niveau des octets. En général, les encodages sont appliqués avant la compression. Comme les différents encodages et algorithmes de compression sont efficaces sur différentes distributions de valeurs, il est essentiel de bien comprendre vos données. ClickHouse prend en charge un grand nombre de codecs et d’algorithmes de compression. Voici quelques recommandations par ordre d’importance : 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.
Les améliorations apportées à la compression pour ces colonnes sont présentées ci-dessous :

Compression dans ClickHouse Cloud

Dans ClickHouse Cloud, nous utilisons par défaut l’algorithme de compression 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.
Dernière modification le 3 juillet 2026