MARS3 DIMS: объявление измерительных столбцов

Предложение DIMS используется для объявления измерительных столбцов при создании таблиц MARS3. Измерительные столбцы обычно представляют логические оси идентификации во временных рядах, например временные метки, идентификаторы устройств или бизнес-теги. Явное объявление измерительных столбцов позволяет YMatrix сохранять метаданные измерений в системных каталогах для последующего просмотра, миграции и интеграции с инструментами.

Измерительные столбцы остаются обычными столбцами таблицы. Их можно использовать в запросах, ключах распределения, ключах сортировки и ключах секционирования. Предложение DIMS добавляет этим столбцам семантику измерений. Оно не создаёт индексы автоматически и не заменяет проектирование DISTRIBUTED BY, ORDER BY или PARTITION BY.

Возможности

После объявления измерительных столбцов с помощью DIMS доступны следующие возможности:

  • Сохранение метаданных измерений: признаки измерительных столбцов сохраняются в системных каталогах.
  • Совместимость с резервным копированием и восстановлением: при миграции структуры таблиц с помощью pg_dump / pg_restore метаданные измерений сохраняются.
  • Улучшенный вывод psql: при просмотре структуры таблицы с помощью \d+ вывод содержит поле Dimensions, в котором перечислены измерительные столбцы таблицы.
  • Единая семантика моделирования: в сценариях временных рядов, мониторинга устройств и IoT можно явно отделять столбцы метрик от измерительных столбцов, что делает схему таблицы более понятной и удобной в сопровождении.

Синтаксис

CREATE TABLE table_name (
    data_column_1 type1,
    data_column_2 type2,
    ...
)
USING MARS3
  [WITH (...)]
  DIMS (dim_column_1 type1 [, dim_column_2 type2, ...])
  DISTRIBUTED BY (dist_key)
  ORDER BY (sort_keys);

DIMS принимает заключённый в скобки список определений столбцов, аналогичный основному списку столбцов в CREATE TABLE.

DIMS (column_name data_type [, column_name data_type, ...])

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

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

Следующий пример создаёт таблицу MARS3 и объявляет tag измерительным столбцом:

CREATE TABLE metrics (
    ts timestamp,
    value float8
)
USING MARS3
  DIMS (tag text)
  DISTRIBUTED BY (tag)
  ORDER BY (ts);

После создания таблица metrics содержит три столбца: tag, ts и value. Столбец tag помечен как измерительный.

Примечание!
Измерительные столбцы становятся фактическими столбцами таблицы. Поэтому на них можно ссылаться как на обычные столбцы в DISTRIBUTED BY, ORDER BY, запросах и операторах записи.

Объявление нескольких измерительных столбцов

В DIMS можно объявить несколько измерительных столбцов:

CREATE TABLE sensor_data (
    reading numeric
)
USING MARS3
  DIMS (device_id int, ts timestamp)
  DISTRIBUTED BY (device_id)
  ORDER BY (device_id, ts);

В этом примере device_id и ts объявлены измерительными столбцами. Их также можно использовать как ключи распределения и сортировки.

Использование измерительных столбцов как ключей сортировки

Измерительные столбцы можно указывать в ORDER BY для определения ключа сортировки таблицы MARS3:

CREATE TABLE logs (
    level int,
    msg text
)
USING MARS3
  DIMS (ts timestamp)
  DISTRIBUTED BY (level)
  ORDER BY (ts);

В этом примере ts является и измерительным столбцом, и ключом сортировки.

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

DIMS можно использовать вместе с MARS3 Unique Mode:

CREATE TABLE latest_reading (
    value int NOT NULL
)
USING MARS3
  WITH (uniquemode=true)
  DIMS (device_id int NOT NULL, ts timestamp NOT NULL)
  DISTRIBUTED BY (device_id)
  ORDER BY (device_id, ts);

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

Примечание!
Если включён Unique Mode, первый столбец в предложении ORDER BY должен быть определён как NOT NULL.

Использование идентификаторов в кавычках

Если имя измерительного столбца содержит пробелы, дефисы или символы с учётом регистра, используйте двойные кавычки:

CREATE TABLE data (
    id int
)
USING MARS3
  DIMS ("capture time" timestamp, "sensor-ID" int)
  DISTRIBUTED BY (id)
  ORDER BY (id);

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

SELECT "capture time", "sensor-ID"
FROM data;

Просмотр измерительных столбцов

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

Используйте \d+, чтобы просмотреть информацию об измерительных столбцах таблицы MARS3:

\d+ my_table

Пример вывода:

                      Table "public.my_table"
 Column |            Type             | ...
--------+-----------------------------+-----
 ts     | timestamp without time zone | ...
 id     | integer                     | ...
 value  | numeric                     | ...
Distributed by: (id)
Order by: (id)
Options: dim_columns=ts,id, mars3options=nbuckets=3
Dimensions: ts, id

Поле Dimensions перечисляет измерительные столбцы, объявленные для таблицы.

Запрос системных каталогов

Измерительные столбцы также можно получить из системных каталогов:

SELECT attname
FROM pg_attribute
WHERE attrelid = 'my_table'::regclass
  AND attnum > 0
  AND attoptions @> ARRAY['is_dimension=true']
ORDER BY attnum;

Порядок столбцов

При создании таблицы с DIMS измерительные столбцы располагаются перед обычными столбцами в физическом порядке столбцов.

Пример:

CREATE TABLE t (
    a int,
    b text
)
USING MARS3
  DIMS (c int, d text)
  DISTRIBUTED BY (c)
  ORDER BY (c);

Физический порядок столбцов:

c, d, a, b

Поэтому, если оператор INSERT не указывает имена столбцов явно, значения должны соответствовать физическому порядку столбцов:

INSERT INTO t VALUES (1, 'x', 10, 'hello');

Рекомендуется явно указывать имена столбцов, чтобы избежать ошибочной записи из-за порядка столбцов:

INSERT INTO t (c, d, a, b) VALUES (1, 'x', 10, 'hello');

Ограничения

Предложение DIMS имеет следующие ограничения:

Ограничение Описание
Движок хранения DIMS поддерживается только для таблиц, созданных с USING MARS3. HEAP, AO и другие движки хранения не поддерживаются.
Внешние таблицы DIMS не поддерживается для внешних таблиц.
Пустой список DIMS () является недопустимым синтаксисом.
Содержимое определения Внутри DIMS разрешены только определения столбцов. Предложение LIKE и ограничения уровня таблицы не поддерживаются.
Конфликты имён Имена измерительных столбцов не должны совпадать с именами обычных столбцов или других измерительных столбцов.
Поведение DIMS только объявляет семантику измерений. Оно не создаёт индексы автоматически и не изменяет распределение, сортировку или секционирование данных.

Рекомендации

  • Объявляйте измерительными столбцами стабильные поля, которые часто используются для фильтрации или идентификации субъекта данных, например идентификаторы устройств, временные метки сбора данных и бизнес-теги.
  • Если измерительные столбцы часто используются в точечных запросах, диапазонных запросах или агрегирующих фильтрах, рассмотрите возможность использования их как ключей распределения, сортировки или секционирования с учётом шаблонов запросов.
  • Для таблиц временных рядов распространённый подход состоит в том, чтобы объявить идентификатор устройства и поле времени измерительными столбцами, а затем выбрать подходящие DISTRIBUTED BY и ORDER BY в соответствии с шаблоном запросов.
  • Явно указывайте имена столбцов в операторах записи, чтобы избежать смещения значений из-за того, что измерительные столбцы физически располагаются перед обычными столбцами.