Passer au contenu principal

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 suivantes renvoient automatiquement les valeurs modifiées. Lorsque les mutations à la volée ne sont pas activées, vous devrez peut-être attendre que vos mutations soient appliquées par un processus en arrière-plan pour voir 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

Créons une table et exécutons quelques mutations :
Vérifions le résultat des mises à jour à l’aide d’une requête SELECT :
Notez que les valeurs des lignes n’ont pas encore été mises à jour au moment où nous interrogeons la nouvelle table :
Voyons maintenant ce qui se passe lorsque nous activons les mutations à la volée :
La requête SELECT renvoie désormais immédiatement le résultat correct, sans avoir à attendre que les mutations soient appliquées :

Impact sur les performances

Lorsque les mutations à la volée sont activées, les mutations ne sont pas matérialisées immédiatement, mais appliquées uniquement lors des requêtes SELECT. Notez toutefois qu’elles continuent d’être matérialisées de manière Asynchronous en arrière-plan, ce qui constitue un processus coûteux. Si le nombre de mutations soumises dépasse durablement, sur un certain intervalle de temps, le nombre de mutations traitées en arrière-plan, la queue des mutations non matérialisées à appliquer continuera de croître. Cela finira par dégrader les performances des requêtes SELECT. Nous recommandons d’activer le paramètre apply_mutations_on_fly 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 infinie des mutations non matérialisées.

Prise en charge des sous-requêtes et des fonctions non déterministes

Les mutations à la volée offrent une prise en charge limitée des sous-requêtes et des fonctions non déterministes. Seules les sous-requêtes scalaires dont le résultat est de taille raisonnable (contrôlée par le paramètre 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 :
  • mutations_execute_nondeterministic_on_initiator - si true, les fonctions non déterministes sont exécutées sur la réplique initiatrice et remplacées par des littéraux dans les requêtes UPDATE et DELETE. Valeur par défaut : false.
  • mutations_execute_subqueries_on_initiator - si true, les sous-requêtes scalaires sont exécutées sur la réplique initiatrice et remplacées par des littéraux dans les requêtes UPDATE et DELETE. Valeur par défaut : false.
  • mutations_max_literal_size_to_replace - taille maximale, en octets, des littéraux sérialisés à remplacer dans les requêtes UPDATE et DELETE. Valeur par défaut : 16384 (16 KiB).
Dernière modification le 29 juin 2026