Il s’agit d’une fonctionnalité expérimentale qui pourra, dans les versions ultérieures, évoluer de manière incompatible avec les versions précédentes.
Activez l’utilisation du moteur de table TimeSeries
à l’aide du paramètre allow_experimental_time_series_table.
Saisissez la commande
set allow_experimental_time_series_table = 1.Syntaxe
Le mot-clé
SAMPLES a pour alias DATA, maintenu pour assurer la rétrocompatibilité.Utilisation
TimeSeries sans préciser de liste de colonnes) :
Colonnes externes
Exemple :
metric_name peut être vide lors de l’insertion, ce qui signifie que le nom de la métrique est indiqué dans tags sous __name__, par exemple :
metric_family, type, unit et help :
Spécification des colonnes externes
time_series peut être déclarée explicitement dans une instruction CREATE TABLE afin de remplacer son type par défaut Array(Tuple(DateTime64(3), Float64)). ClickHouse extrait du tuple le type d’horodatage et le type scalaire, puis les propage à la table d’échantillons interne :
timestamp et value dans la clause INNER COLUMNS de samples :
CREATE TABLE, les types déclarés doivent être identiques.
Tables cibles
TimeSeries ne possède pas ses propres données : tout est stocké dans ses tables cibles.
Son fonctionnement est similaire à celui d’une vue matérialisée,
à la différence qu’une vue matérialisée n’a qu’une seule table cible,
tandis qu’une table TimeSeries a trois tables cibles nommées samples, tags et metrics.
Les tables cibles peuvent être spécifiées explicitement dans la requête CREATE TABLE,
ou le moteur de table TimeSeries peut générer automatiquement des tables cibles internes.
Les lignes insérées dans une table TimeSeries sont transformées, découpées en blocs, puis insérées dans ces trois tables cibles.
Les tables cibles sont les suivantes :
Table samples
Les colonnes créées par le moteur lui-même reçoivent des codecs de compression pour séries temporelles :
timestamp CODEC(DoubleDelta, ZSTD(1)) et value CODEC(Gorilla, ZSTD(1)). Les horodatages quasi monotones se
compressent très peu avec des codecs génériques et peuvent sinon représenter l’essentiel de la taille sur disque de la table samples.
Voir aussi Ajustement des types de colonnes.
La table tags contient des identifiants calculés pour chaque combinaison d’un nom de métrique et de tags.
La table tags doit contenir les colonnes suivantes :
Table metrics
Création
TimeSeries.
L’instruction la plus simple
SHOW CREATE TABLE my_table) :
INNER COLUMNS.
Les tables cibles internes portent des noms tels que .inner_id.samples.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,
.inner_id.tags.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, .inner_id.metrics.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
et chaque table cible possède son propre jeu de colonnes :
Création d’une table à partir d’une table existante
CREATE TABLE new_table AS existing_table copie les éléments suivants de existing_table :
SETTINGSINNER COLUMNSpour chaque typeINNER ENGINEpour chaque type
existing_table comporte des cibles externes.
La liste des colonnes externes est régénérée et non copiée.
Ajustement des types de colonnes
INNER COLUMNS. Par exemple, pour stocker les horodatages en microsecondes et les valeurs en Float32, utilisez :
La colonne id
id contient des identifiants ; chacun d’eux est calculé à partir d’une combinaison d’un nom de métrique et de tags.
Le type et l’expression DEFAULT utilisés pour générérer les identifiants peuvent être personnalisés via la clause TAGS INNER COLUMNS :
id peut être de tout type comparable non-Nullable. Les types de id déclarés dans les tables internes samples et tags doivent correspondre.
Si aucune expression DEFAULT n’est définie pour la colonne id et que le paramètre id_generator n’est pas défini, ClickHouse choisira automatiquement l’expression DEFAULT en fonction du type de id, mais uniquement si celui-ci est UUID, UInt64, UInt128, FixedString(16) ou un tuple de deux de ces types. Pour un tel tuple, l’expression choisie automatiquement calcule un hash du nom de métrique dans le premier composant et un hash de tous les tags dans le second composant.
Le paramètre id_generator offre la même possibilité de personnalisation sans utiliser la clause INNER COLUMNS :
id, même si le DEFAULT de la colonne contient une expression différente.
La colonne tags contient tous les tags d’une série temporelle, y compris le tag __name__ avec le nom d’une métrique.
Le paramètre tags_to_columns permet de spécifier qu’un tag donné doit également être stocké dans une colonne distincte
en plus de la map au sein de la colonne tags :
instance et job à la table cible interne des tags.
Les valeurs des tags instance et job seront stockées à la fois dans ces colonnes et dans la colonne tags.
Dans les tables créées par d’anciennes versions de ClickHouse, la colonne
tags contient uniquement les tags sans colonnes
dédiées et sans le nom de la métrique, et la colonne all_tags est une colonne éphémère qui était remplie lors de l’insertion
avec tous les tags à l’exception du nom de la métrique.Moteurs des tables cibles internes
- la table samples utilise MergeTree ;
- la table tags utilise AggregatingMergeTree, car les mêmes données sont souvent insérées plusieurs fois dans cette table ; il faut donc
un moyen de supprimer les doublons, et ce moteur est également nécessaire pour effectuer une agrégation sur les colonnes
min_timeetmax_time; - la table metrics utilise ReplacingMergeTree, car les mêmes données sont souvent insérées plusieurs fois dans cette table ; il faut donc un moyen de supprimer les doublons.
tags) en dehors de sa clé de tri,
ce que AggregatingMergeTree refuse par défaut (voir allow_dimensions_outside_sorting_key).
C’est sans danger ici, car ces colonnes dépendent fonctionnellement de id, qui fait partie de la clé de tri, de sorte que toutes les
lignes qu’une fusion en arrière-plan regroupe partagent les mêmes valeurs. Lorsque la table interne de tags est générée ou que son
moteur est spécifié en intégré comme ci-dessus, TimeSeries y définit automatiquement allow_dimensions_outside_sorting_key = 1 ;
pour une table de tags d’agrégation externe créée manuellement, vous devez le définir vous-même.
Tables cibles externes
TimeSeries utilise une table créée manuellement :
id, timestamp, value et les <tag_value_column> répertoriées dans tags_to_columns) doivent correspondre à ceux que la table TimeSeries générerait sinon en interne (voir Samples table, Tags table et Metrics table pour les contraintes de type). Les incompatibilités de type sont signalées lors de CREATE.
L’expression du générateur d’identifiant pour une cible de tags externe est évaluée au moment de l’INSERT, dans l’ordre suivant : le paramètre id_generator (s’il est défini), puis la valeur DEFAULT déclarée sur la colonne id de la table externe (le cas échéant), puis le générateur canonique dérivé du type de id. Le paramètre remplace donc toute valeur DEFAULT déclarée sur la table externe — voir la colonne id pour plus de détails.
Modifier les paramètres
CREATE :
id_generatorfilter_by_min_time_and_max_time
id_generator alors que des données sont déjà présentes dans la table Tags peut produire des ID différents pour la même combinaison métrique+tag — les anciennes lignes conservent leurs anciens ID, les nouvelles lignes utilisent le nouveau générateur.
Les autres paramètres ne peuvent pas être modifiés avec ALTER ... MODIFY SETTING, car ils sont figés dans le schéma des tables internes au moment du CREATE.
Paramètres
TimeSeries :
Fonctions
TimeSeries comme argument :