Skip to main content
Движок таблицы для хранения временных рядов, то есть набора значений, связанных с временными метками и тегами (или метками):
Это возможность в статусе закрытой предварительной версии, которая в будущих релизах может измениться с нарушением обратной совместимости. Включите использование движка таблицы TimeSeries с помощью настройки enable_time_series_table. Введите команду set enable_time_series_table = 1.
Движок таблицы TimeSeries доступен в ClickHouse Cloud в статусе закрытой предварительной версии. В сервисах, участвующих в закрытой предварительной версии, уже настроена настройка enable_time_series_table. В других сервисах ClickHouse Cloud эта конфигурация отсутствует, и вы не можете самостоятельно включить движок в таком сервисе.

Синтаксис

У ключевого слова SAMPLES есть псевдоним DATA, а у ключевого слова METRIC FAMILIES — псевдоним METRICS; оба сохранены для обратной совместимости. Определение таблицы версии ниже 4 записывается с METRICS, чтобы его мог прочитать более старый сервер.

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

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

Внешние столбцы

Столбцы таблицы TimeSeries создаются автоматически. Это внешние столбцы: они не хранят данные, а лишь предоставляют интерфейс для SELECT/INSERT. Сами данные хранятся в целевых таблицах. Вот список внешних столбцов: Пример:
metric_name может быть пустым при вставке — это означает, что имя метрики задаётся в tags, в поле __name__, например:
Чтобы вставить метаданные метрик, вставьте значения в столбцы metric_family, type, unit и help:

Указание внешних столбцов

Внешний столбец samples можно явно указать в операторе CREATE TABLE, чтобы переопределить его тип по умолчанию Array(Tuple(DateTime64(3), Float64)) (его прежнее имя time_series также допускается). ClickHouse извлекает из кортежа тип временной метки и скалярный тип и использует их во внутренней таблице samples:
Это равносильно прямому объявлению типов столбцов временной метки и значения в предложении INNER COLUMNS для samples:
Если обе формы используются в одном операторе CREATE TABLE, объявленные типы должны совпадать.

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

У таблицы TimeSeries нет собственных данных — всё хранится в её целевых таблицах. Это похоже на то, как работает materialized view, с той разницей, что у materialized view одна целевая таблица, тогда как у таблицы TimeSeries есть три обязательные целевые таблицы: samples, tags и metric families, а также необязательная целевая таблица recent samples, включённая по умолчанию (см. настройку recent_samples_ttl_seconds). Целевые таблицы можно либо явно указать в запросе CREATE TABLE, либо движок таблицы TimeSeries может автоматически сгенерировать внутренние целевые таблицы. Строки, вставленные в таблицу TimeSeries, преобразуются, разбиваются на блоки и вставляются в эти целевые таблицы. Целевые таблицы бывают следующими:

Таблица samples

Таблица samples содержит временные ряды, связанные с определённым идентификатором. Таблица samples должна содержать следующие столбцы: Столбцы, которые движок создаёт самостоятельно, используют кодеки сжатия временных рядов: timestamp CODEC(Delta, T64, ZSTD(3)) и value CODEC(ALP, ZSTD(3)). Почти монотонные временные метки плохо сжимаются универсальными кодеками и в противном случае могут составлять основную часть размера таблицы samples на диске. Движок включает ALP для своих внутренних таблиц samples и recent samples, не требуя установки enable_alp_codec. См. также Настройка типов столбцов.

Таблица recent samples

Таблица recent samples необязательна и включена по умолчанию (см. настройку recent_samples_ttl_seconds; при установке значения 0 таблица отключается). Она содержит копию образцов, возраст которых меньше TTL, заданного этой настройкой, и должна иметь те же столбцы, что и таблица samples. Генерируемый столбец timestamp использует CODEC(Delta, T64, ZSTD(3)), а генерируемый столбец value — CODEC(ALP, ZSTD(3)). Каждый добавленный образец записывается как в таблицу samples, так и в таблицу recent samples. Запросы, временной диапазон которых входит в окно TTL, читают данные из таблицы recent samples, а не из основной таблицы samples, поскольку она значительно меньше (это можно отключить настройкой уровня запроса time_series_prefer_recent_samples_table). TTL внутренней таблицы recent samples всегда определяется настройкой recent_samples_ttl_seconds.

Таблица tags

Таблица tags содержит идентификаторы, вычисляемые для каждой комбинации имени метрики и тегов. Таблица tags должна содержать следующие столбцы: Новые внутренние таблицы tags версии 5 и выше с движком семейства MergeTree имеют инвертированный текстовый индекс по tags: INDEX tags_idx tags TYPE text(tokenizer = 'keyValuePairs'). Он ускоряет точные совпадения меток, например {job="api"} в PromQL, за счёт совместного поиска по ключу и значению. Сравнения с пустой строкой также соответствуют отсутствующим меткам и не используют этот индекс. Явные индексы, объявленные в TAGS INNER COLUMNS, заменяют индекс по умолчанию. Существующие таблицы и внешние таблицы tags сохраняют свои индексы; чтобы включить индекс, добавьте и материализуйте его в их целевой таблице tags.

Таблица metric families

Таблица metric families содержит информацию о собираемых семействах метрик, их типах и описаниях. Семейство метрик — это группа метрик с одинаковым именем (тег __name__) и одинаковым типом; например, histogram — это семейство метрик, состоящее из нескольких метрик. Таблица metric families должна иметь следующие столбцы:

Создание

Существует несколько способов создать таблицу с движком TimeSeries. Самый простой оператор
фактически создаст следующую таблицу (это можно проверить, выполнив SHOW CREATE TABLE my_table):
Столбцы были созданы автоматически, а также имеются четыре внутренних целевых таблицы с собственными определениями столбцов, хранящимися в конструкциях INNER COLUMNS. Настройка recent_samples_ttl_seconds была записана в конструкцию SETTINGS со значением по умолчанию: эта настройка определяет TTL таблицы recent samples, поэтому её фактическое значение фиксируется при создании. Также последняя версия схемы была зафиксирована в настройке version (см. Версионирование схемы). Внутренние целевые таблицы имеют имена вида .inner_id.samples.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, .inner_id.recentsamples.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, .inner_id.tags.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, .inner_id.metricfamilies.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, и у каждой целевой таблицы есть собственный набор столбцов:

Создание таблицы AS на основе существующей таблицы

Оператор CREATE TABLE new_table AS existing_table создаёт таблицу TimeSeries с той же конфигурацией, что и у existing_table, которая должна быть таблицей TimeSeries. Внешние целевые таблицы (external targets) existing_table не копируются: оператор должен объявить их самостоятельно. Из existing_table копируются:
  • предложение SETTINGS, кроме version: новая таблица всегда получает последнюю версию. Настройки, указанные в самом операторе, объединяются со скопированными по имени, поэтому указанная настройка имеет приоритет над скопированной, а name = DEFAULT сбрасывает скопированную настройку к значению по умолчанию;
  • предложения INNER COLUMNS и INNER ENGINE каждой внутренней таблицы. Изменённые вручную столбцы (например, дополнительные столбцы, столбцы с кодеком или выражением DEFAULT) и изменённые вручную части движка (например, движок с аргументами, пользовательский ключ сортировки или настройка движка) сохраняются, остальные столбцы и части движка приводятся в соответствие настройкам новой таблицы — так, чтобы, например, указанные в операторе tags_to_columns, aggregate_min_time_and_max_time или tags_index_granularity вступили в силу.
Типы столбцов id, временной метки и значения, а также тип репликации внутренних движков (MergeTree, ReplicatedMergeTree или SharedMergeTree) также берутся из existing_table, если оператор не задаёт их явно. Список внешних столбцов генерируется заново, а не копируется. В качестве existing_table можно использовать таблицу, созданную более старой версией ClickHouse: новая таблица получит текущую структуру, например текущий тип id и выражение идентификатора по умолчанию.

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

Вы можете настраивать типы столбцов во внутренних целевых таблицах с помощью предложения INNER COLUMNS. Например, чтобы хранить временные метки в микросекундах, а значения — как Float32, используйте:
Указание внутренних столбцов без кодеков означает использование для них кодека по умолчанию:

Столбец id

Столбец id содержит идентификаторы; каждый из них вычисляется для комбинации имени метрики и тегов. Тип и выражение DEFAULT, используемое для генерации идентификаторов, можно настроить с помощью предложения TAGS INNER COLUMNS:
Столбец id может иметь любой сопоставимый тип, кроме Nullable. Типы id, объявленные во внутренних таблицах samples и tags, должны совпадать. Если для столбца id не указано выражение DEFAULT и параметр id_generator не задан, ClickHouse автоматически выберет выражение DEFAULT на основе типа id, но только если тип id является одним из следующих: UUID, UInt64, UInt128, FixedString(16), те же типы, обёрнутые в LowCardinality, или кортежем из двух таких типов. Для такого кортежа автоматически выбранное выражение вычисляет хеш имени метрики в первом компоненте и хеш всех тегов во втором компоненте. Тип идентификатора LowCardinality, например Tuple(UInt64, LowCardinality(UUID)), хранит идентификаторы в словарной кодировке: таблица samples сохраняет небольшие словари для каждого блока с индексами словаря вместо повторения полного идентификатора в каждой строке, что уменьшает объём данных, считываемых запросами. Параметр id_generator позволяет выполнить ту же настройку без использования предложения INNER COLUMNS:
Если этот параметр задан, для генерации id используется именно он, даже если DEFAULT столбца содержит другое выражение. Тип столбца id также можно указать в параметре id_type вместо предложения INNER COLUMNS:
Если параметр id_generator задан, параметр id_type записывается автоматически при выполнении CREATE, поэтому в определении сохраняется тип, для которого было написано выражение.

Столбец tags

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

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

По умолчанию внутренние целевые таблицы используют следующие движки таблиц:
  • таблица samples использует MergeTree;
  • таблица recent samples использует MergeTree, разбитый на 5-часовые бакеты (см. настройку recent_samples_partition_by), с TTL, определяемым настройкой recent_samples_ttl_seconds, и с включённым ttl_only_drop_parts, поэтому устаревшие части удаляются целиком;
  • таблица tags использует AggregatingMergeTree, поскольку одни и те же данные часто вставляются в эту таблицу несколько раз, поэтому необходим способ удалять дубликаты, а также потому, что для столбцов min_time и max_time требуется выполнять агрегацию;
  • таблица metric families использует ReplacingMergeTree, поскольку одни и те же данные часто вставляются в эту таблицу несколько раз, поэтому необходим способ удалять дубликаты.
Семейство движков создаваемых внутренних таблиц определяется настройкой уровня запроса default_table_engine: при default_table_engine = ReplicatedMergeTree или SharedMergeTree внутренние таблицы используют соответствующие движки Replicated или Shared. При default_table_engine = None (или любом другом значении) движки внутренних таблиц должны быть указаны явно. Все внутренние таблицы должны иметь одинаковый тип репликации: если одна из них реплицируемая (или общая), остальные внутренние таблицы также должны быть реплицируемыми (или общими), иначе их содержимое будет различаться между репликами. Например, объявление SAMPLES INNER ENGINE = ReplicatedMergeTree(...) требует, чтобы остальные внутренние движки также были реплицируемыми — либо объявленными явно, либо созданными с default_table_engine = ReplicatedMergeTree. Для внутренних целевых таблиц также можно использовать другие движки таблиц, если это указано:
Таблица tags хранит столбцы тегов (и Map tags) вне своего ключа сортировки, что AggregatingMergeTree по умолчанию запрещает (см. allow_dimensions_outside_sorting_key). Здесь это безопасно, потому что эти столбцы функционально зависят от id, который является частью ключа сортировки, поэтому все строки, которые объединяются при фоновом слиянии, имеют одинаковые значения. Когда внутренняя таблица tags создаётся или её движок задаётся непосредственно, как показано выше, TimeSeries автоматически устанавливает для неё allow_dimensions_outside_sorting_key = 1; для созданной вручную агрегирующей внешней таблицы tags вы должны установить этот параметр самостоятельно.

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

Таблицу TimeSeries можно настроить так, чтобы она использовала таблицу, созданную вручную:
Внешнюю таблицу также можно использовать в качестве целевой таблицы для recent samples (предложение RECENT SAMPLES my_recent_samples_table). Такая таблица должна иметь те же столбцы, что и внешняя таблица samples, и должна хранить данные не менее recent_samples_ttl_seconds секунд, за что отвечает пользователь. Типы столбцов внешних таблиц (id, timestamp, value и <tag_value_column>, перечисленные в tags_to_columns) должны совпадать с теми, которые таблица TimeSeries в противном случае сгенерировала бы внутри системы (ограничения на типы см. в разделах таблица Samples, таблица Tags и таблица Metric families). О несоответствии типов сообщается во время CREATE. Тип столбца id внешней таблицы tags и выражение, генерирующее идентификаторы, записываются в настройки id_type и id_generator во время CREATE (начиная с версии 2), поэтому определение таблицы TimeSeries сохраняет их: например, CREATE TABLE ... AS my_table считывает тип id из определения my_table, не обращаясь к её внешним целевым таблицам. Если настройка id_generator не задана, ей присваивается значение DEFAULT, объявленное для столбца id внешней таблицы (если оно есть), в противном случае — канонический генератор, определяемый типом id. Записанное выражение используется для генерации id, даже если DEFAULT внешней таблицы впоследствии изменится — подробности см. в разделе Столбец id.

Изменение настроек

После CREATE можно изменить две настройки:
  • id_generator
  • filter_by_min_time_and_max_time
Обратите внимание: если изменить id_generator, когда данные уже есть в таблице tags, для одной и той же комбинации Метрика+тег могут создаваться разные идентификаторы — старые строки сохранят прежние идентификаторы, а новые будут использовать новый генератор. Другие настройки нельзя изменить с помощью ALTER ... MODIFY SETTING: большинство из них закладываются в схему внутренних таблиц во время CREATE, а настройка version фиксируется автоматически во время CREATE и идентифицирует саму схему (см. Версионирование схемы).

Настройки

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

Версионирование схемы

Движок таблицы TimeSeries и слой выполнения PromQL активно развиваются: набор целевых таблиц и их структура могут меняться от версии к версии ClickHouse. Чтобы такие изменения можно было отследить, каждая таблица TimeSeries хранит свою версию в настройке version. Версия автоматически фиксируется в запросе CREATE при создании таблицы — её значением становится последняя версия, известная серверу (сейчас 5), — сохраняется в метаданных таблицы и не может быть изменена с помощью ALTER. Таблицы, созданные до появления этой настройки, считаются таблицами версии 0. Обычно эту настройку достаточно просто не указывать в запросе CREATE TABLE — тогда таблица получит последнюю версию. Явно заданное значение version принимается, если сервер поддерживает эту версию; в этом случае таблица определяется так, как это делает соответствующая версия (см. История версий). CREATE TABLE ... AS other_table не копирует версию другой таблицы, см. Создание таблицы AS на основе существующей таблицы. Сервер поддерживает диапазон версий, причём минимальная версия может отличаться для чтения через SELECT, для записи через INSERT или по протоколу Prometheus remote-write, а также для вычисления PromQL (табличные функции prometheusQuery, prometheusQueryRange, и timeSeriesSelector, диалект promql и HTTP query API Prometheus):
  • Если версия таблицы TimeSeries слишком старая для PromQL, запросы PromQL к ней отклоняются. В тексте исключения предлагается пересоздать таблицу: создайте новую таблицу TimeSeries, скопируйте данные запросом INSERT ... SELECT и замените старую таблицу новой.
  • Если версия слишком старая для записи, запросы INSERT и протокол Prometheus remote-write отклоняются, при этом запросы SELECT продолжают работать.
  • Если версия слишком старая для сервера в принципе, отклоняется любой запрос к таблице (кроме SHOW CREATE TABLE, DETACH и DROP).

История версий

Функции

Ниже приведён список функций, поддерживающих таблицу TimeSeries в качестве аргумента:
Последнее изменение 26 сентября 2026 г.