Перейти к основному содержимому
Перейти к основному содержимому

Движок TimeSeries

Experimental feature. Learn more.
Not supported in ClickHouse Cloud

Движок таблицы, хранящий временные ряды, т.е. набор значений, связанных с временными метками и тегами (или метками):

к сведению

Это экспериментальная функция, которая может измениться несовместимым образом в будущих релизах. Включите использование движка таблицы TimeSeries с помощью настройки allow_experimental_time_series_table. Введите команду set allow_experimental_time_series_table = 1.

Синтаксис

Использование

Проще всего начать с того, что все значения установлены по умолчанию (разрешено создавать таблицу TimeSeries без указания списка столбцов):

Эта таблица может быть использована с следующими протоколами (порт должен быть назначен в конфигурации сервера):

Целевые таблицы

Таблица TimeSeries не имеет своих собственных данных, все хранится в целевых таблицах. Это похоже на то, как работает материализованное представление, с той разницей, что у материализованного представления есть одна целевая таблица, тогда как у таблицы TimeSeries есть три целевые таблицы, названные data, tags и metrics.

Целевые таблицы могут быть либо указаны явно в запросе CREATE TABLE, либо движок таблицы TimeSeries может автоматически генерировать внутренние целевые таблицы.

Целевые таблицы:

Таблица данных

Таблица data содержит временные ряды, связанные с некоторым идентификатором.

Таблица data должна иметь следующие столбцы:

ИмяОбязательно?Тип по умолчаниюВозможные типыОписание
id[x]UUIDлюбойИдентифицирует комбинацию имён метрик и тегов
timestamp[x]DateTime64(3)DateTime64(X)Временная метка
value[x]Float64Float32 или Float64Значение, связанное с timestamp

Таблица тегов

Таблица tags содержит идентификаторы, рассчитанные для каждой комбинации имени метрики и тегов.

Таблица tags должна иметь следующие столбцы:

ИмяОбязательно?Тип по умолчаниюВозможные типыОписание
id[x]UUIDлюбой (должен соответствовать типу id в таблице data)id идентифицирует комбинацию имени метрики и тегов. Выражение DEFAULT определяет, как рассчитать такой идентификатор
metric_name[x]LowCardinality(String)String или LowCardinality(String)Имя метрики
<tag_value_column>[ ]StringString или LowCardinality(String) или LowCardinality(Nullable(String))Значение конкретного тега, имя тега и название соответствующего столбца указаны в настройке tags_to_columns
tags[x]Map(LowCardinality(String), String)Map(String, String) или Map(LowCardinality(String), String) или Map(LowCardinality(String), LowCardinality(String))Карта тегов, исключая тег __name__, содержащий имя метрики, и исключая теги с названиями, перечисленными в настройке tags_to_columns
all_tags[ ]Map(String, String)Map(String, String) или Map(LowCardinality(String), String) или Map(LowCardinality(String), LowCardinality(String))Эфемерный столбец, каждая строка представляет собой карту всех тегов, исключая только тег __name__, содержащий имя метрики. Единственная цель этого столбца — использовать его при вычислении id
min_time[ ]Nullable(DateTime64(3))DateTime64(X) или Nullable(DateTime64(X))Минимальная временная метка временного ряда с этим id. Столбец создается, если store_min_time_and_max_time равно true
max_time[ ]Nullable(DateTime64(3))DateTime64(X) или Nullable(DateTime64(X))Максимальная временная метка временного ряда с этим id. Столбец создается, если store_min_time_and_max_time равно true

Таблица метрик

Таблица metrics содержит информацию о собираемых метриках, типах этих метрик и их описаниях.

Таблица metrics должна иметь следующие столбцы:

ИмяОбязательно?Тип по умолчаниюВозможные типыОписание
metric_family_name[x]StringString или LowCardinality(String)Имя семейства метрик
type[x]StringString или LowCardinality(String)Тип семейства метрик, один из "counter", "gauge", "summary", "stateset", "histogram", "gaugehistogram"
unit[x]StringString или LowCardinality(String)Единица измерения метрики
help[x]StringString или LowCardinality(String)Описание метрики

Любая строка, вставленная в таблицу TimeSeries, на самом деле будет храниться в этих трех целевых таблицах. Таблица TimeSeries содержит все эти столбцы из таблиц data, tags, metrics.

Создание

Существует несколько способов создать таблицу с движком TimeSeries. Самое простое выражение

на самом деле создаст следующую таблицу (вы можете увидеть это, выполнив SHOW CREATE TABLE my_table):

Таким образом, столбцы были сгенерированы автоматически, и в этом операторе также есть три внутренних UUID - по одному для каждой созданной внутренней целевой таблицы. (Внутренние UUID обычно не отображаются до тех пор, пока не будет установлена настройка show_table_uuid_in_table_create_query_if_not_nil.)

Внутренние целевые таблицы имеют названия, такие как .inner_id.data.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, .inner_id.tags.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, .inner_id.metrics.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, и каждая целевая таблица имеет столбцы, которые представляют собой подмножество столбцов основной таблицы TimeSeries:

Настройка типов столбцов

Вы можете настроить типы почти любого столбца внутренних целевых таблиц, явно указывая их при определении главной таблицы. Например,

сделает так, что внутренняя таблица data будет хранить временные метки в микросекундах вместо миллисекунд:

Столбец id

Столбец id содержит идентификаторы, каждый идентификатор вычисляется для комбинации имени метрики и тегов. Выражение DEFAULT для столбца id — это выражение, которое будет использоваться для вычисления таких идентификаторов. Оба типа столбца id и это выражение можно настроить, явно указывая их:

Столбцы tags и all_tags

Существуют два столбца, содержащие карты тегов - tags и all_tags. В этом примере они означают одно и то же, однако они могут отличаться, если используется настройка tags_to_columns. Эта настройка позволяет указать, что определённый тег должен храниться в отдельном столбце вместо хранения в карте внутри столбца tags:

Этот оператор добавит столбцы

в определение как my_table, так и её внутренней целевой таблицы tags. В этом случае столбец tags не будет содержать теги instance и job, но столбец all_tags будет содержать их. Столбец all_tags является эфемерным, и его единственная цель - использовать его в выражении DEFAULT для столбца id.

Типы столбцов можно настроить, явно указывая их:

Движки таблиц внутренних целевых таблиц

По умолчанию внутренние целевые таблицы используют следующие движки таблиц:

  • таблица data использует MergeTree;
  • таблица tags использует AggregatingMergeTree, поскольку одни и те же данные часто вставляются несколько раз в эту таблицу, поэтому нам нужен способ для удаления дубликатов, а также потому, что необходимо проводить агрегацию для столбцов min_time и max_time;
  • таблица metrics использует ReplacingMergeTree, поскольку одни и те же данные часто вставляются несколько раз в эту таблицу, поэтому нам нужен способ для удаления дубликатов.

Другие движки таблиц также могут использоваться для внутренних целевых таблиц, если это указано:

Внешние целевые таблицы

Возможно сделать так, чтобы таблица TimeSeries использовала вручную созданную таблицу:

Настройки

Вот список настроек, которые могут быть указаны при определении таблицы TimeSeries:

ИмяТипПо умолчаниюОписание
tags_to_columnsMapКарта, указывающая, какие теги должны быть помещены в отдельные столбцы в таблице tags. Синтаксис: {'tag1': 'column1', 'tag2' : column2, ...}
use_all_tags_column_to_generate_idBooltrueПри генерации выражения для расчета идентификатора временного ряда этот флаг позволяет использовать столбец all_tags в этом вычислении
store_min_time_and_max_timeBooltrueЕсли установлено в true, то таблица будет хранить min_time и max_time для каждого временного ряда
aggregate_min_time_and_max_timeBooltrueПри создании внутренней целевой таблицы tags этот флаг включает использование SimpleAggregateFunction(min, Nullable(DateTime64(3))) вместо просто Nullable(DateTime64(3)) как типа для столбца min_time, а то же самое - для столбца max_time
filter_by_min_time_and_max_timeBooltrueЕсли установлено в true, то таблица будет использовать столбцы min_time и max_time для фильтрации временных рядов

Функции

Вот список функций, поддерживающих таблицу TimeSeries в качестве аргумента: