Passer au contenu principal

Problème

ClickHouse Cloud ne prend pas en charge les transactions à plusieurs instructions au sens traditionnel des SGBDR. Cela pose deux difficultés courantes :
  1. Atomicité d’une seule table pour les chargements massifs : une approche courante consiste à insérer dans des clés partielles temporaires, puis à copier les enregistrements vers la clé définitive et à supprimer les enregistrements temporaires. Cette approche est peu performante, en particulier à l’étape de suppression, qui peut représenter plus de 90 % du temps total de l’opération.
  2. Cohérence entre plusieurs tables : lorsqu’un pipeline charge correctement la table A mais échoue sur la table B, la table A est déjà validée et ne peut pas être annulée. Les analystes qui interrogent les deux tables voient alors des données désynchronisées.

Contexte

ClickHouse garantit l’atomicité au niveau d’une seule insertion et d’une seule partition : si un INSERT réussit, toutes les lignes de ce bloc sont visibles ; s’il échoue, aucune ne l’est. Cependant, il n’existe pas de mécanisme intégré permettant de valider atomiquement des données réparties sur plusieurs insertions ou plusieurs tables. Les commandes de manipulation de partition (MOVE PARTITION TO TABLE, REPLACE PARTITION, ATTACH PARTITION FROM) agissent au niveau des métadonnées lorsque les tables source et de destination partagent la même politique de stockage. Cela signifie qu’elles s’exécutent presque instantanément, quelle que soit la taille des données, ce qui en fait des briques de base idéales pour des schémas d’échange atomique. Au lieu d’insérer directement dans les tables de production et de tenter un nettoyage en cas d’échec, utilisez des tables intermédiaires dédiées comme zone de dépôt. Après validation des données, utilisez des opérations au niveau des partitions pour basculer atomiquement les données en production.

Étape par étape pour l’atomicité sur une seule table

1

Créer une table intermédiaire

Utilisez le même schéma, la même clé de partition, le même ORDER BY et la même politique de stockage que la table de production.
2

Insérer des données dans la table intermédiaire

Exécutez votre insert sur la table intermédiaire plutôt que sur la table de production.
3

Si l’insert échoue, tronquez et réessayez

Tronquez la table intermédiaire et relancez le chargement. Aucune donnée de production n’a été affectée.
4

Si l’insert réussit, déplacez les partitions en production

Pour déplacer les données en production et les supprimer de la table intermédiaire, utilisez MOVE PARTITION.
Vous pouvez aussi copier les données dans une partition existante en production avec ATTACH PARTITION.
Ces deux opérations sont des modifications au niveau des métadonnées sur la même politique de stockage et s’exécutent presque instantanément.
5

Nettoyer la table intermédiaire

Une fois toutes les partitions déplacées, tronquez la table intermédiaire afin de la laisser vide pour le prochain chargement.

Cohérence entre plusieurs tables

La même approche s’applique aux pipelines où deux tables ou plus doivent être entièrement chargées avant de devenir visibles pour les analystes. Chargez les données de chaque table dans sa propre table intermédiaire et validez-les toutes, puis exécutez les déplacements de partitions en une seule fois. Comme chaque déplacement est une opération sur les métadonnées quasi instantanée, la période pendant laquelle les tables sont incohérentes se réduit : elle passe de la durée du chargement complet au temps nécessaire pour permuter les partitions.

Exigences et contraintes

Pour MOVE PARTITION TO TABLE, REPLACE PARTITION et ATTACH PARTITION FROM, les tables source et de destination doivent avoir :
  • La même structure de colonnes
  • La même clé de partitionnement, la même clé ORDER BY et la même clé primaire
  • La même politique de stockage
  • La table de destination doit inclure tous les index et toutes les projections de la table source

Exemple

Vous pouvez exécuter l’exemple ci-dessous de façon interactive dans fiddle :

Références

Dernière modification le 2 juillet 2026