Choisir une stratégie de mise à jour
- Utiliser des moteurs de table spécialisés qui gèrent les mises à jour par insertions
- Utiliser des mises à jour déclaratives, comme les instructions
UPDATE ... SETouALTER TABLE ... UPDATE
Quand utiliser des moteurs de table spécialisés
Comme les moteurs de table de la famille MergeTree fusionnent les parties de données en arrière-plan, ils offrent une cohérence éventuelle, et le mot-clé
FINAL doit être utilisé pour garantir une déduplication correcte pendant cette période lors de l’interrogation de la table.
Il existe aussi d’autres types de moteurs, mais ce sont les plus couramment utilisés.
Quand utiliser les mises à jour déclaratives
UPDATE déclaratives peuvent être plus simples pour des opérations de mise à jour basiques, sans la complexité de gestion de la logique de déduplication, mais elles conviennent généralement mieux à la mise à jour d’un nombre plus restreint de lignes, moins fréquemment qu’avec des moteurs spécialisés.
Mises à jour avec des moteurs de table spécialisés
ReplacingMergeTree
ReplacingMergeTree supprime les doublons parmi les lignes ayant la même clé de tri lors des fusions en arrière-plan, en ne conservant que la version la plus récente.
FINAL ou une logique de requête équivalente pour obtenir des résultats corrects et dédupliqués. Le modificateur FINAL ajoute une surcharge de requête comprise entre 21 et 550 % selon les données.
ReplacingMergeTree ne peut pas mettre à jour les valeurs de la clé de tri. Il prend également en charge une colonne Deleted pour les suppressions logiques.
Pour en savoir plus : Guide de ReplacingMergeTree | Référence ReplacingMergeTree
CoalescingMergeTree
Nullable. Comme avec ReplacingMergeTree, utilisez FINAL pour obtenir des résultats coalescés corrects.
Ce moteur est disponible à partir de ClickHouse 25.6.
Pour en savoir plus : CoalescingMergeTree
CollapsingMergeTree
CollapsingMergeTree utilise une colonne Sign pour indiquer à ClickHouse comment traiter les lignes lors des fusions. Si -1 est inséré dans la colonne Sign, la ligne sera éliminée (supprimée) lorsqu’elle est appariée à une ligne +1 correspondante. Les lignes à mettre à jour sont identifiées en fonction de la clé de tri utilisée dans la clause ORDER BY lors de la création de la table.
ReplacingMergeTree, CollapsingMergeTree vous permet de modifier les valeurs de la clé de tri. Il est bien adapté aux opérations réversibles avec mécanisme d’annulation, telles que les transactions financières ou le suivi de l’état d’un jeu.
La méthode de mise à jour ci-dessus exige que votre application conserve l’état côté client afin d’insérer la ligne d’annulation. Bien qu’il s’agisse de l’approche la plus efficace du point de vue de ClickHouse, elle peut être complexe à mettre en œuvre à grande échelle. Les requêtes nécessitent également une agrégation avec multiplication par le signe pour produire des résultats corrects.
Mises à jour déclaratives
Mutations
ALTER TABLE ... UPDATE) réécrivent toutes les parts contenant des lignes correspondant à l’expression WHERE.
WHERE.
Ce processus n’a aucun caractère atomique.
Les parts sont remplacées par des parts mutées dès qu’elles sont prêtes, et une requête SELECT qui commence à s’exécuter pendant une mutation verra à la fois les données des parts déjà mutées et celles des parts qui ne l’ont pas encore été.
Vous pouvez suivre l’état d’avancement via la table system.mutations.
Pour en savoir plus : ALTER TABLE UPDATE
Mutations à la volée
ALTER TABLE ... UPDATE, il peut être nécessaire d’attendre qu’un processus en arrière-plan applique les mutations avant de voir les valeurs modifiées apparaître dans vos requêtes.
ClickHouse offre un moyen de modifier ce comportement grâce aux “mutations à la volée”.
Lorsque les mutations à la volée sont activées, les lignes mises à jour sont immédiatement marquées comme telles, et les requêtes SELECT ultérieures renvoient automatiquement les valeurs modifiées.
Les mutations à la volée peuvent être activées pour les tables de la famille MergeTree en activant le paramètre de requête apply_mutations_on_fly.
Exemple
Exemple
Créons une table et exécutons quelques mutations :Vérifions le résultat des mises à jour à l’aide d’une requête Notez que les valeurs des lignes n’ont pas encore été mises à jour lorsque nous interrogeons la nouvelle table :Voyons maintenant ce qui se passe lorsque nous activons les mutations à la volée :La requête
SELECT :SELECT renvoie maintenant immédiatement le résultat correct, sans avoir à attendre que les mutations soient appliquées :Impact sur les performances
SELECT. Notez toutefois que les mutations continuent d’être matérialisées de façon asynchrone en arrière-plan, ce qui représente un processus coûteux.
Si, sur une certaine période, le nombre de mutations soumises dépasse constamment le nombre de mutations traitées en arrière-plan, la file d’attente des mutations non matérialisées à appliquer continuera de grossir. Cela finira par dégrader les performances des requêtes SELECT.
Nous recommandons d’activer le paramètre apply_mutations_on_fly conjointement avec d’autres paramètres au niveau de MergeTree, tels que number_of_mutations_to_throw et number_of_mutations_to_delay, afin de limiter la croissance incontrôlée des mutations non matérialisées.
Prise en charge des sous-requêtes et des fonctions non déterministes
mutations_max_literal_size_to_replace) sont prises en charge. Seules les fonctions non déterministes constantes sont prises en charge (par exemple, la fonction now()).
Ces comportements sont contrôlés par les paramètres suivants :
Mises à jour légères
UPDATE standard et crée immédiatement des patch parts sans attendre les merges. Les valeurs mises à jour sont immédiatement visibles dans les queries SELECT via l’application des patchs, mais ne sont matérialisées physiquement que lors des merges suivants. Cela fait des mises à jour légères une solution idéale pour mettre à jour un faible pourcentage de rows (jusqu’à ~10 % de la table) avec une latence prévisible. Les benchmarks montrent qu’elles peuvent être jusqu’à 23x plus rapides que les mutations.
Le compromis est que les queries SELECT entraînent un surcoût lors de l’application des patchs, et que les patch parts comptent dans les limites de parts. Au-delà du seuil d’environ 10 %, le surcoût lié à l’application des patchs à la lecture augmente proportionnellement, ce qui rend les mutations synchrones plus efficaces pour des mises à jour plus importantes.
En savoir plus : Lightweight UPDATE
Mutations à la volée
Les mutations à la volée offrent un mécanisme permettant de mettre à jour des lignes de sorte que les requêtesSELECT suivantes renvoient automatiquement les valeurs modifiées, sans attendre le traitement en arrière-plan. Cela corrige efficacement la limite d’atomicité des mutations classiques.
SELECT suivantes doivent toutes deux avoir le paramètre apply_mutations_on_fly = 1 activé. Les conditions de la mutation sont stockées dans ClickHouse Keeper, qui conserve tout en mémoire, puis appliquées à la volée lors des requêtes.
Notez qu’une mutation est toujours utilisée pour mettre à jour les données — elle n’est simplement pas matérialisée immédiatement. La mutation sera tout de même appliquée en arrière-plan, de façon asynchrone, et entraîne le même surcoût important qu’une mutation classique. Les expressions pouvant être utilisées avec cette opération sont également limitées (voir les détails).
En savoir plus : Mutations à la volée