Это экспериментальная возможность, которая в будущих релизах может измениться с нарушением обратной совместимости.
Включите использование движка таблицы 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, поскольку одни и те же данные часто вставляются в эту таблицу несколько раз, поэтому необходим способ удалять дубликаты.
tags/all_tags) вне своего ключа сортировки,
что AggregatingMergeTree по умолчанию запрещает (см. allow_dimensions_outside_sorting_key).
Здесь это безопасно, потому что эти столбцы функционально зависят от id, который является частью ключа сортировки, поэтому все
строки, которые объединяются при фоновом слиянии, имеют одинаковые значения. Когда внутренняя таблица tags создаётся или её
движок задаётся непосредственно, как показано выше, TimeSeries автоматически устанавливает для неё allow_dimensions_outside_sorting_key = 1;
для созданной вручную агрегирующей внешней таблицы tags вы должны установить этот параметр самостоятельно.
Внешние целевые таблицы
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 в качестве аргумента: