Limites
Statut d’insertion incertain
Limite de la fenêtre de déduplication
*_deduplication_window autres opérations d’insertion ont lieu pendant la séquence de nouvelles tentatives, la déduplication risque de ne pas fonctionner comme prévu. Dans ce cas, les mêmes données peuvent être insérées plusieurs fois.
Activation de la déduplication des insertions en cas de nouvelles tentatives
Déduplication des insertions pour les tables
*MergeTree prennent en charge la déduplication à l’insertion.
Pour les moteurs *ReplicatedMergeTree, la déduplication des insertions est activée par défaut et contrôlée par les paramètres replicated_deduplication_window et replicated_deduplication_window_seconds. Pour les moteurs *MergeTree non répliqués, la déduplication est contrôlée par le paramètre non_replicated_deduplication_window.
Les paramètres ci-dessus définissent la configuration du journal de déduplication d’une table. Le journal de déduplication stocke un nombre fini de block_id, qui déterminent le fonctionnement de la déduplication (voir ci-dessous).
Déduplication des insertions au niveau de la requête
insert_deduplicate=1 active la déduplication au niveau de la requête. Notez que si vous insérez des données avec insert_deduplicate=0, ces données ne peuvent pas être dédupliquées, même si vous relancez une insertion avec insert_deduplicate=1. En effet, les block_id ne sont pas enregistrés pour les blocs lors des insertions avec insert_deduplicate=0.
Fonctionnement de la déduplication des insertions
*MergeTree, chaque bloc se voit attribuer un block_id unique, qui est un hachage des données de ce bloc. Ce block_id est utilisé comme clé unique pour l’opération d’insertion. Si le même block_id est trouvé dans le journal de déduplication, le bloc est considéré comme un doublon et n’est pas inséré dans la table.
Cette approche fonctionne bien lorsque les insertions contiennent des données différentes. En revanche, si les mêmes données sont insérées intentionnellement plusieurs fois, vous devez utiliser le paramètre insert_deduplication_token pour contrôler le processus de déduplication. Ce paramètre vous permet de spécifier un jeton unique pour chaque insertion, que ClickHouse utilise pour déterminer si les données constituent un doublon.
Pour les requêtes INSERT ... VALUES, le découpage des données insérées en blocs est déterministe et dépend des paramètres. Vous devez donc relancer les insertions avec les mêmes valeurs de paramètres que lors de l’opération initiale.
Pour les requêtes INSERT ... SELECT, il est important que la partie SELECT de la requête renvoie les mêmes données dans le même ordre à chaque opération. Notez toutefois que cela est difficile à obtenir en pratique. Pour garantir un ordre stable des données lors des nouvelles tentatives, définissez une clause ORDER BY ALL dans la partie SELECT de la requête. À l’heure actuelle, vous devez utiliser exactement ORDER BY ALL dans la requête. La prise en charge de ORDER BY n’est pas encore implémentée et la partie SELECT de la requête ne serait pas considérée comme stable. Gardez à l’esprit qu’il est possible que la table sélectionnée soit mise à jour entre deux tentatives : les données renvoyées peuvent avoir changé et la déduplication n’aura alors pas lieu. En outre, lorsque vous insérez de grands volumes de données, il est possible que le nombre de blocs après les insertions dépasse la fenêtre du journal de déduplication, et ClickHouse ne puisse alors pas dédupliquer les blocs.
À l’heure actuelle, le comportement de INSERT ... SELECT est contrôlé par le paramètre insert_select_deduplicate. Ce paramètre détermine si la déduplication est appliquée aux données insérées à l’aide de requêtes INSERT ... SELECT. Consultez la documentation liée pour plus de détails et des exemples d’utilisation.
Déduplication des insertions avec les vues matérialisées
replicated_deduplication_windowreplicated_deduplication_window_secondsnon_replicated_deduplication_window
deduplicate_blocks_in_dependent_materialized_views.
Lorsque le paramètre insert_deduplicate=1 est activé, les données insérées sont dédupliquées dans la table source. Le paramètre deduplicate_blocks_in_dependent_materialized_views=1 active en plus la déduplication dans les tables dépendantes. Vous devez activer les deux si vous souhaitez une déduplication complète.
Lors de l’insertion de blocs dans des tables sous des vues matérialisées, ClickHouse calcule le block_id en hachant une chaîne qui combine les block_id de la table source et des identifiants supplémentaires. Cela garantit une déduplication précise au sein des vues matérialisées, en permettant de distinguer les données selon leur insertion d’origine, indépendamment des transformations appliquées avant qu’elles n’atteignent la table de destination sous la vue matérialisée.
Exemples
Blocs identiques après transformation dans une vue matérialisée
dst. 2 blocs issus du select — 2 parts à l’insertion. Les parts contiennent des données différentes.
mv_dst. Ces parts contiennent les mêmes données, mais elles ne sont pas dédupliquées.
dst et mv_dst.
Blocs identiques à l’insertion
dst. Cependant, nous constatons qu’un seul bloc a été inséré dans la table dst. Cela s’explique par le fait que le deuxième bloc a été dédupliqué. Il contient les mêmes données ainsi que la clé de déduplication block_id, calculée comme un hash à partir des données insérées. Ce comportement n’est pas celui attendu. De tels cas sont rares, mais théoriquement possibles. Pour gérer correctement de tels cas, l’utilisateur doit fournir un insert_deduplication_token. Corrigeons cela avec les exemples suivants :
Blocs identiques à l’insertion avec insert_deduplication_token
insert_deduplication_token est prioritaire : ClickHouse n’utilise pas l’empreinte de hachage des données lorsque insert_deduplication_token est fourni.
Différentes opérations d’insertion aboutissent aux mêmes données après transformation dans la table sous-jacente de la vue matérialisée
mv_dst. Les données ne sont pas dédupliquées, car les données source étaient différentes.
Insertions depuis différentes vues matérialisées dans une même table sous-jacente avec des données équivalentes
mv_dst (comme prévu).
dst et mv_dst.