Analytique en temps réelEntrepôt de donnéesObservabilitéIA/MLCloudOss
Prérequis
- A running ClickHouse Cloud service. If you don’t have one yet, complete the Create your first Cloud service quickstart first.
Ce que vous allez créer
ORDER BY et PARTITION BY pertinentes, chargerez des données directement depuis S3, puis interrogerez system.parts pour voir comment ClickHouse organise physiquement les données sur disque.
À la fin, vous comprendrez pourquoi le moteur MergeTree est à la base de presque toutes les tables ClickHouse, et comment ses choix de tri et de partitionnement influencent directement les performances des requêtes.
1
Comprendre le fonctionnement de MergeTree
Avant d’écrire la moindre requête SQL, il est utile de comprendre ce qui distingue MergeTree d’une table de base de données traditionnelle.Lorsque vous insérez des données dans une table MergeTree, ClickHouse n’écrit pas les lignes une par une. À la place, il écrit une data part — un petit bloc de lignes trié et compressé — directement sur disque. ClickHouse fusionne ensuite ces parties en arrière-plan au fil du temps. C’est de là que vient le nom : merge + tree.Chaque data part est triée selon l’expressionORDER BY de la table. Cet ordre de tri devient l’index de clé primaire, ce qui permet à ClickHouse d’ignorer de grands blocs de données qu’il n’a pas besoin de lire lors d’une requête (c’est ce qu’on appelle le data pruning). Plus les colonnes de votre ORDER BY sont sélectives pour vos requêtes les plus fréquentes, moins ClickHouse lit de données.Trois clauses contrôlent la manière dont MergeTree organise vos données :Vous devriez maintenant être en mesure d’expliquer la relation entre les data parts, la clé primaire et les performances des requêtes dans une table MergeTree.
2
Aperçu des données source
Avant de créer votre table, examinez le fichier source à l’aide de la fonction de tables3. Cela vous permet d’interroger directement S3 sans avoir à écrire d’abord des données dans ClickHouse.Exécutez ce qui suit dans votre console SQL :Nullable(String). ClickHouse lit un CSV brut, il ne connaît donc pas les véritables types de données ; c’est ce que vous corrigerez lorsque vous définirez le schéma de votre table à l’étape suivante.Affichez un aperçu de quelques lignes :id de la transaction, le price de vente, la date, le type de bien, les champs d’adresse et les identifiants géographiques. Vous remarquerez également deux colonnes finales (column15, column16) qui sont vides - vous pouvez les ignorer.Vérifiez-le en confirmant que vous voyez des lignes avec notamment les colonnes id, price, date, postcode, type, town et county.3
Concevez et créez votre table MergeTree
Créez maintenant une table permanente avec un schéma approprié. Les types de colonnes ci-dessous ont été choisis délibérément :LowCardinality(String)est utilisé pour les colonnes ayant un nombre limité de valeurs uniques (codes postaux, noms de villes, noms de comtés). Il utilise en interne un encodage par dictionnaire, ce qui réduit considérablement le volume de stockage et améliore les performances pour le regroupement et le filtrage sur ces colonnes.Enum8encode les colonnestypeetdurationsous forme de petits entiers sur le disque, tout en conservant des libellés textuels lisibles dans les requêtes. Le CSV source utilise des codes à une seule lettre ; nous les mapperons donc lors de l’insertion.PARTITION BY toYYYYMM(date)crée une partition par mois calendaire, ce qui permet à ClickHouse d’ignorer des mois entiers lorsque votre clauseWHEREfiltre surdate.ORDER BY (postcode, addr1, addr2)trie les données pour permettre des recherches rapides par adresse du bien — le modèle d’accès le plus naturel pour ce jeu de données.
ENGINE = MergeTree, ClickHouse Cloud a créé la table avec SharedMergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}'). C’est normal : Cloud convertit automatiquement MergeTree en SharedMergeTree, ce qui ajoute la réplication et la prise en charge du stockage partagé. Le comportement et l’interface de requête restent les mêmes.4
Charger des données depuis S3
Insérez l’intégralité du jeu de données en sélectionnant directement à partir de la fonction de tables3(). ClickHouse lit le fichier compressé depuis S3 en flux et l’écrit dans votre table sous forme de parties triées.T pour maison mitoyenne, F pour pleine propriété, Y/N pour construction neuve), nous utilisons transform pour les convertir en libellés explicites et toUInt32/if pour convertir les colonnes numériques. Les colonnes id, column15 et column16 sont exclues, car nous n’en avons pas besoin.Cela prendra une à deux minutes, selon la taille de votre service. Une fois l’opération terminée, confirmez le nombre de lignes :5
Inspecter les parts à l’aide de system.parts
C’est ici que les composants internes de MergeTree deviennent visibles. La tablesystem.parts suit chaque data part sur le disque pour chaque table MergeTree de votre service.partition- la valeurYYYYMMdérivée de votre expressionPARTITION BY. Les données de chaque mois sont isolées.name- le nom de la partie encode la partition, la plage de numéros de blocs et le niveau de fusion (par ex.199501_1_4_2signifie la partition199501, les blocs 1–4, fusionnés deux fois).marks- le nombre de granules d’index. Chaque granule couvre 8 192 lignes par défaut, et l’index de clé primaire stocke une entrée par granule. C’est cet index clairsemé qui reste en mémoire et permet d’ignorer rapidement les données non pertinentes.bytes_on_disk- ClickHouse compresse par défaut chaque partie, colonne par colonne, avec LZ4. Comparez cette valeur à la taille brute pour apprécier le taux de compression.
active = true garantit que vous ne voyez que les parts actuelles, fusionnées, plutôt que d’anciennes parts en attente de nettoyage.6
Interrogez les données et observez le comportement de la clé primaire
Exécutez maintenant de véritables requêtes analytiques. Commencez par rechercher les ventes les plus élevées jamais enregistrées :price ne fait pas partie de la clé ORDER BY, ClickHouse ne peut pas utiliser l’index primaire pour ignorer certaines données et doit donc effectuer un scan complet de la table.Ensuite, recherchez le prix de vente moyen par comté :county ne figure ni dans ORDER BY ni dans PARTITION BY, donc ClickHouse parcourt l’ensemble de la table.Exécutez maintenant une requête qui combine l’agrégation avec votre ORDER BY. Comme les données sont triées selon (postcode, addr1, addr2), le filtrage sur un préfixe de code postal permet à ClickHouse d’ignorer la majeure partie de la table. Nous déterminons ici le prix de vente moyen par année pour les biens immobiliers de la zone de code postal SW1A :postcode ne devrait lire qu’une fraction des lignes de la table, ce qui montre l’index de clé primaire à l’œuvre. Comparez cela aux requêtes précédentes, qui effectuent un balayage plus large : la différence montre pourquoi il est important de choisir le bon ORDER BY.