Это экспериментальная возможность, которая в будущих релизах может измениться с нарушением обратной совместимости.
Включите использование движка таблицы TimeSeries
с помощью настройки allow_experimental_time_series_table.
Введите команду
set allow_experimental_time_series_table = 1.Синтаксис
У ключевого слова
SAMPLES есть псевдоним DATA, сохранённый для обратной совместимости.Использование
TimeSeries можно создать, не указывая список столбцов):
Внешние столбцы
Пример:
metric_name может быть пустым при вставке — это означает, что имя метрики задаётся в tags, в поле __name__, например:
metric_family, type, unit и help:
Указание внешних столбцов
time_series можно явно указать в операторе CREATE TABLE, чтобы переопределить его тип по умолчанию Array(Tuple(DateTime64(3), Float64)). ClickHouse извлекает из кортежа тип временной метки и скалярный тип и использует их во внутренней таблице samples:
INNER COLUMNS для samples:
CREATE TABLE, объявленные типы должны совпадать.
Целевые таблицы
TimeSeries нет собственных данных — всё хранится в её целевых таблицах.
Это похоже на то, как работает materialized view,
с той разницей, что у materialized view одна целевая таблица,
тогда как у таблицы TimeSeries их три: samples, tags и metrics.
Целевые таблицы можно либо явно указать в запросе CREATE TABLE,
либо движок таблицы TimeSeries может автоматически сгенерировать внутренние целевые таблицы.
Строки, вставленные в таблицу TimeSeries, преобразуются, разбиваются на блоки и вставляются в эти три целевые таблицы.
Целевые таблицы бывают следующими:
Таблица samples
Таблица tags содержит идентификаторы, вычисляемые для каждой комбинации имени метрики и тегов.
Таблица tags должна содержать следующие столбцы:
Таблица metrics
Создание
TimeSeries можно создать несколькими способами.
Самый простой оператор
SHOW CREATE TABLE my_table):
INNER COLUMNS.
Внутренние целевые таблицы имеют имена вида .inner_id.samples.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,
.inner_id.tags.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, .inner_id.metrics.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,
и каждая целевая таблица имеет собственный набор столбцов:
Создание таблицы AS на основе существующей таблицы
CREATE TABLE new_table AS existing_table копирует из existing_table:
SETTINGSINNER COLUMNSдля каждого видаINNER ENGINEдля каждого вида
existing_table есть внешние цели.
Внешний список столбцов формируется заново, а не копируется.
Настройка типов столбцов
INNER COLUMNS. Например, чтобы хранить временные метки в микросекундах, а значения — как Float32:
Столбец id
id содержит идентификаторы; каждый из них вычисляется для комбинации имени метрики и тегов.
Тип и выражение DEFAULT, используемое для генерации идентификаторов, можно настроить с помощью конструкции TAGS INNER COLUMNS:
id должен быть одним из следующих: UUID, UInt64, UInt128 или FixedString(16). Если выражение DEFAULT не указано, ClickHouse автоматически выберет его на основе типа id. Типы id, объявленные во внутренних таблицах samples и tags, должны совпадать.
Параметр id_generator позволяет выполнить ту же настройку без использования конструкции INNER COLUMNS:
id используется именно он, даже если DEFAULT столбца содержит другое выражение.
Есть два столбца, содержащих карты тегов, — tags и all_tags. В этом примере они означают одно и то же, однако могут различаться,
если используется настройка tags_to_columns. Эта настройка позволяет указать, что определённый тег следует хранить в отдельном столбце, а не
в карте внутри столбца tags:
instance и job во внутреннюю целевую таблицу tags.
В этом случае столбец tags не будет содержать теги instance и job,
но столбец all_tags будет их содержать. Столбец all_tags является эфемерным, и его единственное назначение — использоваться в выражении DEFAULT
для столбца id.
Движки внутренних целевых таблиц
- таблица samples использует MergeTree;
- таблица tags использует AggregatingMergeTree, поскольку одни и те же данные часто вставляются в эту таблицу несколько раз, поэтому необходим способ
удалять дубликаты, а также потому, что для столбцов
min_timeиmax_timeтребуется выполнять агрегацию; - таблица metrics использует ReplacingMergeTree, поскольку одни и те же данные часто вставляются в эту таблицу несколько раз, поэтому необходим способ удалять дубликаты.
Внешние целевые таблицы
TimeSeries можно настроить так, чтобы она использовала таблицу, созданную вручную:
id, timestamp, value и <tag_value_column>, перечисленные в tags_to_columns) должны совпадать с теми, которые таблица TimeSeries в противном случае сгенерировала бы внутри системы (ограничения на типы см. в разделах таблица Samples, таблица Tags и таблица Metrics). О несоответствии типов сообщается во время CREATE.
Выражение генератора id для внешней целевой таблицы tags вычисляется во время INSERT в следующем порядке: сначала настройка id_generator (если она задана), затем DEFAULT, объявленный для столбца id внешней таблицы (если он есть), и затем канонический генератор, определяемый типом id. Таким образом, эта настройка имеет приоритет над любым DEFAULT, объявленным для внешней таблицы — подробности см. в разделе Столбец id.
Изменение настроек
CREATE можно изменить две настройки:
id_generatorfilter_by_min_time_and_max_time
id_generator, когда данные уже есть в таблице tags, для одной и той же комбинации metric+tag могут создаваться разные идентификаторы — старые строки сохранят прежние идентификаторы, а новые будут использовать новый генератор.
Другие настройки нельзя изменить с помощью ALTER ... MODIFY SETTING, потому что они закладываются в схему внутренних таблиц во время CREATE.
Настройки
TimeSeries:
Функции
TimeSeries в качестве аргумента: