Skip to main content
Um motor de tabela que armazena séries temporais, ou seja, um conjunto de valores associados a timestamps e tags (ou labels):
Este é um recurso experimental que pode mudar de formas incompatíveis com versões anteriores em lançamentos futuros. Habilite o uso do motor de tabela TimeSeries com a configuração allow_experimental_time_series_table. Execute o comando set allow_experimental_time_series_table = 1.

Sintaxe

A palavra-chave SAMPLES tem um alias DATA, mantido por compatibilidade com versões anteriores.

Uso

É mais fácil começar com tudo configurado com os valores padrão (é permitido criar uma tabela TimeSeries sem especificar uma lista de colunas):
Essa tabela pode ser usada com os seguintes protocolos (uma porta deve ser atribuída na configuração do servidor):

Colunas externas

As colunas de uma tabela TimeSeries são geradas automaticamente. São colunas externas: não armazenam dados, apenas fornecem a interface para SELECT/INSERT. Os dados reais são armazenados em tabelas de destino. Aqui está a lista das colunas externas: Exemplo:
É permitido que metric_name fique vazio na inserção; isso significa que o nome da métrica é especificado em tags, em __name__, por exemplo:
Para inserir os metadados das métricas, insira nas colunas metric_family, type, unit e help:

Especificando colunas externas

A coluna externa time_series pode ser listada explicitamente em uma instrução CREATE TABLE para substituir seu tipo padrão Array(Tuple(DateTime64(3), Float64)). O ClickHouse extrai, da tupla, os tipos de timestamp e do valor escalar e os propaga para a tabela interna de amostras:
Isso equivale a declarar diretamente, na cláusula INNER COLUMNS de samples, os tipos das colunas de timestamp e valor:
Se ambas as formas forem usadas na mesma instrução CREATE TABLE, os tipos declarados deverão coincidir.

Tabelas de destino

Uma tabela TimeSeries não armazena dados próprios; tudo é armazenado em suas tabelas de destino. Isso é semelhante ao funcionamento de uma visão materializada, com a diferença de que uma visão materializada tem uma tabela de destino, enquanto uma tabela TimeSeries tem três tabelas de destino chamadas samples, tags e metrics. As tabelas de destino podem ser especificadas explicitamente na consulta CREATE TABLE ou o motor de tabela TimeSeries pode gerar automaticamente tabelas de destino internas. As linhas inseridas em uma tabela TimeSeries são transformadas, divididas em blocos e inseridas nessas três tabelas de destino. As tabelas de destino são as seguintes:

Tabela samples

A tabela samples contém séries temporais associadas a um identificador. A tabela samples deve ter as seguintes colunas:

Tabela de tags

A tabela tags contém identificadores calculados para cada combinação de nome de métrica e tags. A tabela tags deve ter as colunas:

Tabela de métricas

A tabela metrics contém algumas informações sobre as métricas coletadas, os tipos dessas métricas e suas descrições. A tabela metrics deve conter as colunas:

Criação

Há várias maneiras de criar uma tabela com o motor de tabela TimeSeries. A instrução mais simples
na verdade, criará a tabela a seguir (você pode verificar isso executando SHOW CREATE TABLE my_table):
Assim, as colunas foram geradas automaticamente, e também há três tabelas de destino internas com suas próprias definições de colunas armazenadas nas cláusulas INNER COLUMNS. As tabelas de destino internas têm nomes como .inner_id.samples.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, .inner_id.tags.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, .inner_id.metrics.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx e cada tabela de destino tem seu próprio conjunto de colunas:

Criando uma tabela AS com base em uma tabela existente

A instrução CREATE TABLE new_table AS existing_table copia da existing_table:
  • SETTINGS
  • INNER COLUMNS para cada tipo
  • INNER ENGINE para cada tipo
A instrução não é permitida se a existing_table tiver alvos externos. A lista externa de colunas é regenerada, e não copiada.

Ajustando os tipos das colunas

Você pode ajustar os tipos das colunas nas tabelas de destino internas usando a cláusula INNER COLUMNS. Por exemplo, para armazenar timestamps em microssegundos e valores como Float32:
A mesma cláusula pode ser usada para especificar codecs e outros atributos da coluna:

A coluna id

A coluna id contém identificadores; cada identificador é calculado com base em uma combinação de nome de métrica e tags. O tipo e a expressão DEFAULT usados para gerar identificadores podem ser personalizados por meio da cláusula TAGS INNER COLUMNS:
O tipo da coluna id deve ser um dos seguintes: UUID, UInt64, UInt128 ou FixedString(16). Se nenhuma expressão DEFAULT for fornecida, ClickHouse a escolherá automaticamente com base no tipo de id. Os tipos de id declarados nas tabelas internas samples e tags devem corresponder. A configuração id_generator oferece a mesma personalização sem usar a cláusula INNER COLUMNS:
Se essa configuração estiver definida, ela será usada para gerar o id, mesmo que o DEFAULT da coluna contenha uma expressão diferente.

As colunas tags e all_tags

Há duas colunas que contêm maps de tags: tags e all_tags. Neste exemplo, elas são equivalentes, mas podem ser diferentes se a configuração tags_to_columns for usada. Essa configuração permite especificar que uma tag específica deve ser armazenada em uma coluna separada, em vez de ficar armazenada em um map dentro da coluna tags:
Esta instrução adicionará as colunas instance e job à tabela de destino interna de tags. Nesse caso, a coluna tags não conterá as tags instance e job, mas a coluna all_tags conterá. A coluna all_tags é efêmera e serve apenas para ser usada na expressão DEFAULT da coluna id.

Motores de tabela das tabelas de destino internas

Por padrão, as tabelas de destino internas usam os seguintes motores de tabela:
  • a tabela samples usa MergeTree;
  • a tabela tags usa AggregatingMergeTree porque os mesmos dados costumam ser inseridos várias vezes nessa tabela, então precisamos de uma forma de remover duplicatas, além de ser necessário fazer agregação para as colunas min_time e max_time;
  • a tabela metrics usa ReplacingMergeTree porque os mesmos dados costumam ser inseridos várias vezes nessa tabela, então precisamos de uma forma de remover duplicatas.
Outros motores de tabela também podem ser usados nas tabelas de destino internas, caso isso seja especificado:

Tabelas de destino externas

É possível fazer com que uma tabela TimeSeries use uma tabela criada manualmente:
Os tipos de coluna das tabelas externas (id, timestamp, value e os <tag_value_column> listados em tags_to_columns) devem corresponder aos que a tabela TimeSeries geraria internamente (consulte Tabela samples, Tabela de Tags e Tabela de métrica para as restrições de tipo). Incompatibilidades de tipo são informadas no momento do CREATE. A expressão do gerador de ID para um destino externo de tags é resolvida no momento do INSERT, na seguinte ordem: a configuração id_generator (se definida), depois o DEFAULT declarado na coluna id da tabela externa (se houver) e, por fim, o gerador canônico derivado do tipo de id. Portanto, a configuração substitui qualquer DEFAULT declarado na tabela externa — consulte A coluna id para mais detalhes.

Alterando configurações

Duas configurações podem ser alteradas após CREATE:
  • id_generator
  • filter_by_min_time_and_max_time
Observe que alterar id_generator quando já existem dados na tabela de tags pode gerar IDs diferentes para a mesma combinação de métrica+tag — as linhas antigas mantêm seus IDs antigos, e as linhas novas usam o novo gerador. As outras configurações não podem ser alteradas com ALTER ... MODIFY SETTING porque são incorporadas ao esquema das tabelas internas no momento do CREATE.

Configurações

Aqui está uma lista de configurações que podem ser especificadas ao definir uma tabela TimeSeries:

Funções

Aqui está uma lista de funções que aceitam uma tabela TimeSeries como argumento:
Última modificação em 3 de julho de 2026