Passer au contenu principal
Un moteur de table qui stocke des séries temporelles, c’est-à-dire un ensemble de valeurs associées à des horodatages et à des tags (ou labels) :
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

Il est plus facile de commencer en laissant tous les paramètres par défaut (il est possible de créer une table TimeSeries sans préciser de liste de colonnes) :
Cette table peut ensuite être utilisée avec les protocoles suivants (un port doit être défini dans la configuration du serveur) :

Colonnes externes

Les colonnes d’une table TimeSeries sont générées automatiquement. Ce sont des colonnes externes : elles ne stockent aucune donnée et servent uniquement d’interface pour SELECT/INSERT. Les données réelles sont stockées dans les tables cibles. Voici la liste des 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 :
Pour insérer les métadonnées des métriques, insérez-les dans les colonnes metric_family, type, unit et help :

Spécification des colonnes externes

La colonne externe 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 :
Cela revient à déclarer directement les types des colonnes timestamp et value dans la clause INNER COLUMNS de samples :
Si les deux formes sont utilisées dans la même instruction CREATE TABLE, les types déclarés doivent être identiques.

Tables cibles

Une table 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

La table samples contient des séries temporelles associées à un certain identifiant. La table samples doit comporter les colonnes suivantes :

Table des tags

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

La table metrics contient des informations sur les métriques collectées, leurs types et leurs descriptions. La table metrics doit comporter les colonnes suivantes :

Création

Il existe plusieurs façons de créer une table avec le moteur de table TimeSeries. L’instruction la plus simple
créera en fait la table suivante (vous pouvez le vérifier en exécutant SHOW CREATE TABLE my_table) :
Les colonnes ont donc été générées automatiquement, et il existe également trois tables cibles internes avec leurs propres définitions de colonnes stockées dans les clauses 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

L’instruction CREATE TABLE new_table AS existing_table copie les éléments suivants de existing_table :
  • SETTINGS
  • INNER COLUMNS pour chaque type
  • INNER ENGINE pour chaque type
L’instruction n’est pas autorisée si existing_table comporte des cibles externes. La liste des colonnes externes est régénérée et non copiée.

Modifier le type des colonnes

Vous pouvez modifier le type des colonnes dans les tables cibles internes à l’aide de la clause INNER COLUMNS. Par exemple, pour stocker les horodatages en microsecondes et les valeurs en Float32 :
La même clause peut être utilisée pour spécifier des codecs et d’autres attributs de colonne :

La colonne id

La colonne 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érer les identifiants peuvent être personnalisés via la clause TAGS INNER COLUMNS :
Le type de la colonne id doit être l’un des suivants : UUID, UInt64, UInt128 ou FixedString(16). Si aucune expression DEFAULT n’est définie, ClickHouse la choisira automatiquement en fonction du type de id. Les types de id déclarés dans les tables internes samples et tags doivent correspondre. Le paramètre id_generator offre la même possibilité de personnalisation sans utiliser la clause INNER COLUMNS :
Si ce paramètre est défini, il est utilisé pour générer id, même si le DEFAULT de la colonne contient une expression différente.

Les colonnes tags et all_tags

Il existe deux colonnes contenant des maps de tags : tags et all_tags. Dans cet exemple, elles ont la même signification, mais elles peuvent être différentes si le paramètre tags_to_columns est utilisé. Ce paramètre permet de spécifier qu’un tag donné doit être stocké dans une colonne distincte plutôt que dans une map au sein de la colonne tags :
Cette instruction ajoute les colonnes instance et job à la table cible interne des tags. Dans ce cas, la colonne tags ne contiendra pas les tags instance et job, mais la colonne all_tags, si. La colonne all_tags est éphémère et sert uniquement à être utilisée dans l’expression DEFAULT de la colonne id.

Moteurs des tables cibles internes

Par défaut, les tables cibles internes utilisent les moteurs de table suivants :
  • 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_time et max_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.
D’autres moteurs de table peuvent également être utilisés pour les tables cibles internes si cela est explicitement spécifié :

Tables cibles externes

Il est possible de faire en sorte qu’une table TimeSeries utilise une table créée manuellement :
Les types de colonnes des tables externes (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

Deux paramètres peuvent être modifiés après CREATE :
  • id_generator
  • filter_by_min_time_and_max_time
Notez que la modification de 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

Voici la liste des paramètres qui peuvent être spécifiés lors de la définition d’une table TimeSeries :

Fonctions

Voici une liste de fonctions qui acceptent une table TimeSeries comme argument :
Dernière modification le 29 juin 2026