ClickHouse met à jour périodiquement les dictionnaires en fonction de la balise LIFETIME (définie en secondes).
LIFETIME correspond à l’intervalle de mise à jour des dictionnaires entièrement téléchargés et à l’intervalle d’invalidation des dictionnaires mis en cache.
Pendant les mises à jour, l’ancienne version d’un dictionnaire reste interrogeable. Les mises à jour de dictionnaires ne bloquent pas les requêtes, sauf lors de leur chargement initial. Si une erreur se produit pendant une mise à jour, elle est consignée dans le journal du serveur, et les requêtes peuvent continuer à utiliser l’ancienne version du dictionnaire. Si la mise à jour d’un dictionnaire réussit, l’ancienne version du dictionnaire est remplacée de manière atomique.
Exemple de paramètres :
<dictionary>
...
<lifetime>300</lifetime>
...
</dictionary>ou
CREATE DICTIONARY (...)
...
LIFETIME(300)
...Le paramètre <lifetime>0</lifetime> (LIFETIME(0)) empêche les dictionnaires de se mettre à jour.
Vous pouvez définir un intervalle de temps pour les mises à jour, et ClickHouse choisira un instant aléatoire de manière uniforme dans cette plage. Cela permet de répartir la charge sur la source du dictionnaire lors des mises à jour sur un grand nombre de serveurs.
Exemple de paramètres :
<dictionary>
...
<lifetime>
<min>300</min>
<max>360</max>
</lifetime>
...
</dictionary>ou
LIFETIME(MIN 300 MAX 360)Si <min>0</min> et <max>0</max>, ClickHouse ne recharge pas le dictionnaire en fonction du délai d'expiration.
Dans ce cas, ClickHouse peut recharger le dictionnaire plus tôt si le fichier de configuration du dictionnaire a été modifié ou si la commande SYSTEM RELOAD DICTIONARY a été exécutée.
Lors de la mise à jour des dictionnaires, le serveur ClickHouse applique une logique différente selon le type de source :
- Pour un fichier texte, il vérifie l'heure de modification. Si elle diffère de celle enregistrée précédemment, le dictionnaire est mis à jour.
- Les dictionnaires provenant d'autres sources sont mis à jour à chaque fois par défaut.
Pour les autres sources (ODBC, PostgreSQL, ClickHouse, etc.), vous pouvez configurer une requête afin que les dictionnaires ne soient mis à jour que s'ils ont réellement changé, au lieu de l'être à chaque fois. Pour ce faire, suivez les étapes suivantes :
- La table du dictionnaire doit comporter un champ qui change systématiquement lorsque les données de la source sont mises à jour.
- Les paramètres de la source doivent spécifier une requête qui récupère le champ variable. Le serveur ClickHouse interprète le résultat de la requête comme une ligne, et si cette ligne a changé par rapport à son état précédent, le dictionnaire est mis à jour. Spécifiez la requête dans le champ
<invalidate_query>des paramètres de la source.
Exemple de paramètres :
<dictionary>
...
<odbc>
...
<invalidate_query>SELECT update_time FROM dictionary_source where id = 1</invalidate_query>
</odbc>
...
</dictionary>ou
...
SOURCE(ODBC(... invalidate_query 'SELECT update_time FROM dictionary_source where id = 1'))
...Pour les dictionnaires Cache, ComplexKeyCache, SSDCache et SSDComplexKeyCache, les mises à jour synchrones et asynchrones sont prises en charge.
Les dictionnaires Flat, Hashed, HashedArray et ComplexKeyHashed peuvent également ne demander que les données modifiées depuis la mise à jour précédente. Si update_field est défini dans la configuration de la source du dictionnaire, la valeur de l’horodatage de la mise à jour précédente, en secondes, sera ajoutée à la requête de données. Selon le type de source (Executable, HTTP, MySQL, PostgreSQL, ClickHouse ou ODBC), une logique différente sera appliquée à update_field avant de demander les données à une source externe.
- Si la source est HTTP,
update_fieldest ajouté en tant que paramètre de requête, avec comme valeur l’heure de la dernière mise à jour. - Si la source est Executable,
update_fieldest ajouté en tant qu’argument du script exécutable, avec comme valeur l’heure de la dernière mise à jour. - Si la source est ClickHouse, MySQL, PostgreSQL ou ODBC, une condition
WHEREsupplémentaire est ajoutée, dans laquelleupdate_fieldest comparé à l’heure de la dernière mise à jour avec l’opérateur supérieur ou égal.- Par défaut, cette condition
WHEREest vérifiée au niveau le plus élevé de la requête SQL. Il est également possible de la vérifier dans n’importe quelle autre clauseWHEREde la requête à l’aide du mot-clé{condition}. Exemple :... SOURCE(CLICKHOUSE(... update_field 'added_time' QUERY ' SELECT my_arr.1 AS x, my_arr.2 AS y, creation_time FROM ( SELECT arrayZip(x_arr, y_arr) AS my_arr, creation_time FROM dictionary_source WHERE {condition} )' )) ...
- Par défaut, cette condition
Si l’option update_field est définie, l’option supplémentaire update_lag peut également être définie. La valeur de l’option update_lag est soustraite de l’heure de la mise à jour précédente avant la requête des données mises à jour.
Exemple de paramètres :
<dictionary>
...
<clickhouse>
...
<update_field>added_time</update_field>
<update_lag>15</update_lag>
</clickhouse>
...
</dictionary>ou
...
SOURCE(CLICKHOUSE(... update_field 'added_time' update_lag 15))
...