Meilleures pratiques ClickHouse
Guide complet pour ClickHouse couvrant la conception de schémas, l'optimisation des requêtes, l'ingestion de données et la connectivité des agents IA. Contient 31 règles réparties dans 4 catégories principales (schéma, requête, insertion, agent), classées par impact.
Documentation officielle : ClickHouse Best Practices
IMPORTANT : Comment appliquer cette compétence
Avant de répondre aux questions ClickHouse, suivez cet ordre de priorité :
- Vérifiez les règles applicables dans le répertoire
rules/ - Si des règles existent : Appliquez-les et citez-les dans votre réponse en utilisant « Selon
nom-règle... » - Si aucune règle n'existe : Utilisez les connaissances ClickHouse du LLM ou consultez la documentation
- En cas d'incertitude : Effectuez une recherche web pour les meilleures pratiques actuelles
- Citez toujours votre source : nom de la règle, « conseils généraux ClickHouse », ou URL
Pourquoi les règles ont la priorité : ClickHouse a des comportements spécifiques (stockage en colonnes, index peu denses, mécanique de merge tree) où l'intuition générale des bases de données peut être trompeuse. Les règles encodent des conseils validés et spécifiques à ClickHouse.
Connectivité des agents et workflow de requête
Avant d'interroger ClickHouse, les agents doivent établir une connexion et suivre le workflow de découverte :
rules/agent-connect-mcp.md- Configuration de la connexion (MCP + CLI), découverte des identifiants, sélection du format de sortierules/agent-discovery-schema.md- CRITIQUE : workflow de découverte de schéma en 7 étapesrules/agent-query-safety.md- CRITIQUE : LIMIT, timeouts, exploration progressive
Chaque session d'agent doit suivre cette séquence :
- Connexion — établir la connexion via MCP ou CLI (voir
agent-connect-mcp) - Découverte — bases de données → tables → colonnes + commentaires → sort keys → skip indexes → échantillon → EXPLAIN
- Planification — utiliser les connaissances de sort key et skip index pour écrire des clauses WHERE efficaces
- Exécution — exécuter les requêtes avec LIMIT et timeouts
- Récupération — en cas de timeout/erreurs mémoire, affinez les filtres et réessayez (voir
agent-query-safety)
Notes sur l'architecture des sous-agents
Si votre système distribue les tâches ClickHouse à des sous-agents spécialisés :
- Découverte de schéma + exécution de requête : n'importe quel modèle — les étapes sont procédurales
- Analyse EXPLAIN + optimisation de requête : bénéficie du raisonnement de niveau intermédiaire
- Examen de conception de schéma par rapport aux 28 règles : bénéficie du raisonnement de niveau intermédiaire
Procédures d'examen
Pour les examens de schéma (CREATE TABLE, ALTER TABLE)
Lisez ces fichiers de règles dans l'ordre :
rules/schema-pk-plan-before-creation.md- ORDER BY est immuablerules/schema-pk-cardinality-order.md- Ordre des colonnes dans les clésrules/schema-pk-prioritize-filters.md- Inclusion de colonne filtréerules/schema-types-native-types.md- Sélection de type appropriéerules/schema-types-minimize-bitwidth.md- Dimensionnement du type numériquerules/schema-types-lowcardinality.md- Utilisation de LowCardinalityrules/schema-types-avoid-nullable.md- Nullable vs DEFAULTrules/schema-partition-low-cardinality.md- Limites de décompte de partitionrules/schema-partition-lifecycle.md- Objectif du partitionnement
Vérifiez :
- [ ] Ordre des colonnes PRIMARY KEY / ORDER BY (cardinalité basse vers haute)
- [ ] Les types de données correspondent aux plages de données réelles
- [ ] LowCardinality appliqué aux colonnes de chaîne appropriées
- [ ] La cardinalité de clé de partition est bornée (100-1 000 valeurs)
- [ ] ReplacingMergeTree a une colonne de version si utilisée
Pour les examens de requête (SELECT, JOIN, agrégations)
Lisez ces fichiers de règles :
rules/query-join-choose-algorithm.md- Sélection d'algorithmerules/query-join-filter-before.md- Filtrage avant joinrules/query-join-use-any.md- ANY vs JOIN normalrules/query-index-skipping-indices.md- Utilisation d'index secondairerules/schema-pk-filter-on-orderby.md- Alignement des filtres avec ORDER BY
Vérifiez :
- [ ] Les filtres utilisent les colonnes de préfixe ORDER BY
- [ ] Les JOINs filtrent les tables avant de joindre (pas après)
- [ ] Algorithme de JOIN correct pour les tailles de table
- [ ] Indices de saut pour les colonnes de filtre non-ORDER BY
Pour les examens de stratégie d'insertion (ingestion de données, mises à jour, suppressions)
Lisez ces fichiers de règles :
rules/insert-batch-size.md- Exigences de dimensionnement de lotrules/insert-mutation-avoid-update.md- Alternatives UPDATErules/insert-mutation-avoid-delete.md- Alternatives DELETErules/insert-async-small-batches.md- Utilisation d'insertion asynchronerules/insert-optimize-avoid-final.md- Risques OPTIMIZE TABLE
Vérifiez :
- [ ] Taille de lot 10 000-100 000 lignes par INSERT
- [ ] Pas d'ALTER TABLE UPDATE pour les changements fréquents
- [ ] ReplacingMergeTree ou CollapsingMergeTree pour les motifs de mise à jour
- [ ] Les insertions asynchrones activées pour les lots petits et haute fréquence
Format de sortie
Structurez votre réponse comme suit :
## Règles vérifiées
- `nom-règle-1` - Conforme / Violation détectée
- `nom-règle-2` - Conforme / Violation détectée
...
## Résultats
### Violations
- **`nom-règle`** : Description du problème
- Actuel : [ce que le code fait]
- Requis : [ce qu'il devrait faire]
- Correction : [correction spécifique]
### Conforme
- `nom-règle` : Note brève sur pourquoi c'est correct
## Recommandations
[Liste priorisée des modifications, citant les règles]
Catégories de règles par priorité
| Priorité | Catégorie | Impact | Préfixe | Nombre de règles |
|---|---|---|---|---|
| 1 | Sélection de clé primaire | CRITIQUE | schema-pk- |
4 |
| 2 | Sélection de type de données | CRITIQUE | schema-types- |
5 |
| 3 | Optimisation JOIN | CRITIQUE | query-join- |
5 |
| 4 | Traitement par lots d'insertion | CRITIQUE | insert-batch- |
1 |
| 5 | Évitement de mutation | CRITIQUE | insert-mutation- |
2 |
| 6 | Stratégie de partitionnement | ÉLEVÉE | schema-partition- |
4 |
| 7 | Indices de saut | ÉLEVÉE | query-index- |
1 |
| 8 | Vues matérialisées | ÉLEVÉE | query-mv- |
2 |
| 9 | Insertions asynchrones | ÉLEVÉE | insert-async- |
2 |
| 10 | Évitement OPTIMIZE | ÉLEVÉE | insert-optimize- |
1 |
| 11 | Utilisation JSON | MOYENNE | schema-json- |
1 |
| 12 | Découverte de schéma agent | CRITIQUE | agent-discovery- |
1 |
| 13 | Sécurité des requêtes agent | CRITIQUE | agent-query- |
1 |
| 14 | Connectivité agent + formats | ÉLEVÉE | agent-connect- |
1 |
Référence rapide
Conception de schéma - Clé primaire (CRITIQUE)
schema-pk-plan-before-creation- Planifiez ORDER BY avant la création de table (immuable)schema-pk-cardinality-order- Ordonnez les colonnes de cardinalité basse à hauteschema-pk-prioritize-filters- Incluez les colonnes filtrées fréquemmentschema-pk-filter-on-orderby- Les filtres de requête doivent utiliser le préfixe ORDER BY
Conception de schéma - Types de données (CRITIQUE)
schema-types-native-types- Utilisez les types natifs, pas String pour toutschema-types-minimize-bitwidth- Utilisez le plus petit type numérique qui convientschema-types-lowcardinality- LowCardinality pour <10 000 chaînes uniquesschema-types-enum- Enum pour les ensembles de valeurs finies avec validationschema-types-avoid-nullable- Évitez Nullable ; utilisez DEFAULT à la place
Conception de schéma - Partitionnement (ÉLEVÉE)
schema-partition-low-cardinality- Gardez le décompte de partition 100-1 000schema-partition-lifecycle- Utilisez le partitionnement pour le cycle de vie des données, pas les requêtesschema-partition-query-tradeoffs- Comprenez les compromis d'élagage de partitionschema-partition-start-without- Envisagez de commencer sans partitionnement
Conception de schéma - JSON (MOYENNE)
schema-json-when-to-use- JSON pour les schémas dynamiques ; colonnes typées pour les schémas connus
Optimisation de requête - JOINs (CRITIQUE)
query-join-choose-algorithm- Sélectionnez l'algorithme en fonction des tailles de tablequery-join-use-any- ANY JOIN quand un seul match est nécessairequery-join-filter-before- Filtrez les tables avant de joindrequery-join-consider-alternatives- Dictionnaires/dénormalisation vs JOINquery-join-null-handling- join_use_nulls=0 pour les valeurs par défaut
Optimisation de requête - Indices (ÉLEVÉE)
query-index-skipping-indices- Indices de saut pour les filtres non-ORDER BY
Optimisation de requête - Vues matérialisées (ÉLEVÉE)
query-mv-incremental- MVs incrémentielles pour les agrégations en temps réelquery-mv-refreshable- MVs actualisables pour les joins complexes
Stratégie d'insertion - Traitement par lots (CRITIQUE)
insert-batch-size- Lot de 10 000-100 000 lignes par INSERT
Stratégie d'insertion - Asynchrone (ÉLEVÉE)
insert-async-small-batches- Insertions asynchrones pour les lots petits et haute fréquenceinsert-format-native- Format natif pour la meilleure performance
Stratégie d'insertion - Mutations (CRITIQUE)
insert-mutation-avoid-update- ReplacingMergeTree au lieu d'ALTER UPDATEinsert-mutation-avoid-delete- DELETE léger ou DROP PARTITION
Stratégie d'insertion - Optimisation (ÉLEVÉE)
insert-optimize-avoid-final- Laissez les fusions en arrière-plan fonctionner
Intégration agent - Découverte (CRITIQUE)
agent-discovery-schema- Découvrez toujours le schéma avant d'interroger
Intégration agent - Sécurité (CRITIQUE)
agent-query-safety- LIMIT, timeouts, exploration progressive
Intégration agent - Connectivité + formats (ÉLEVÉE)
agent-connect-mcp- Configuration MCP + CLI, découverte d'identifiants, sélection de format de sortie
Quand appliquer
Cette compétence s'active quand vous rencontrez :
-
Agent IA se connectant à ClickHouse (MCP, CLI, HTTP)
-
Conception de workflow d'agent pour ClickHouse
-
Demandes de découverte ou d'exploration de schéma
-
Instructions
CREATE TABLE -
Modifications
ALTER TABLE -
Discussions sur
ORDER BYouPRIMARY KEY -
Questions de sélection de type de données
-
Dépannage de requêtes lentes
-
Demandes d'optimisation JOIN
-
Conception de pipeline d'ingestion de données
-
Questions de stratégie de mise à jour/suppression
-
Utilisation de ReplacingMergeTree ou d'autres moteurs spécialisés
-
Décisions de stratégie de partitionnement
Structure des fichiers de règles
Chaque fichier de règle dans rules/ contient :
- Frontmatter YAML : titre, niveau d'impact, étiquettes
- Explication brève : Pourquoi cette règle importe
- Exemple incorrect : Antimodèle avec explication
- Exemple correct : Meilleure pratique avec explication
- Contexte supplémentaire : Compromis, quand appliquer, références
Document compilé complet
Pour le guide complet avec toutes les règles développées en ligne : AGENTS.md
Utilisez AGENTS.md quand vous devez vérifier plusieurs règles rapidement sans lire les fichiers individuels.