Основные функции MatrixBench

В этом документе подробно описываются некоторые базовые функции MatrixBench, включая следующие разделы:

  • Поддержка различных типов данных и характеристик
  • Комбинированные запросы

Примечание!
В настоящее время mxbench является проектом с открытым исходным кодом, мы приветствуем ваш отзыв и вклад. Пожалуйста, нажмите здесь, чтобы ознакомиться с файлом README.

1 Поддержка различных типов данных и характеристик

1.1 Возможности

Примечание!
Из-за специфики временных сценариев mxbench требует, чтобы первый столбец таблицы данных был столбцом временной метки (timestamp), второй столбец — идентификатором устройства, а начиная с третьего столбца — располагались показатели, в которые можно записывать пользовательские данные. В настоящее время поддержка нескольких типов данных и функций характеристик доступна только для столбцов показателей, то есть начиная с третьего столбца.

  • В настоящее время mxbench может генерировать различные типы показателей в таблице сигналов: помимо четырёх типов int4, int8, float4 и float8, также поддерживаются text и varchar.
  • Для типов int4, int8, float4 и float8 можно дополнительно указать характеристики данных, такие как диапазон значений.
  • Тип varchar предоставляет специальные типы plate_template и vin_template для лучшего соответствия требованиям сценариев интернета вещей (IoV). Тип plate_template используется для генерации столбца характеристик типа номерного знака (varchar), например: Guangdong BDM7709. Тип vin_template используется для генерации столбца характеристик типа номера кузова (varchar), например: 1G1JC124627237595.

1.2 Ограничения

  • Первый столбец должен быть столбцом временной метки (timestamp), имя столбца может быть любым, но тип должен быть timestamp или timestamptz.
  • Второй столбец должен содержать идентификатор устройства или список устройств, имя столбца может быть любым, тип должен быть одним из: text, varchar, int8.

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

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

1.3.1 Реализация через DDL-файлы

В DDL-файле после создания таблицы назначение столбца указывается с помощью комментария: COMMENT ON COLUMN.

CREATE EXTENSION IF NOT EXISTS matrixts;
ALTER EXTENSION matrixts UPDATE;
CREATE SCHEMA IF NOT EXISTS "public";
CREATE TABLE "public"."table1" (
    tsss timestamp
,   vinnn bigint
,   lltt varchar(32)
,   c_arb float8
,   exttt json
)
USING mars2 WITH ( compress_threshold='1000', chunk_size='32' )
DISTRIBUTED BY (vinnn)
PARTITION BY RANGE(tsss) (
        START ('2022-04-18 09:00:00')
        END ('2022-04-19 09:00:06')
        EVERY ('10800 second'),
        DEFAULT PARTITION default_prt
);

CREATE INDEX IF NOT EXISTS "idx_table1" ON "public"."table1"
USING mars2_btree(
        vinnn
      , tsss);

COMMENT ON COLUMN table1.lltt is '{"name": "plate_template"}';
COMMENT ON COLUMN table1.c_arb is '{"min": 3.5, "max": 5}';
COMMENT ON COLUMN table1.exttt is '{"is-ext": true, "columns-descriptions": [{"type": "float8", "count": 1, "comment": {"min": 3, "max": 4}},{"type": "float4", "count": 3, "comment": {"min": 2, "max": 3}}]}';

Пример конфигурации приведён выше. Все строки COMMENT имеют формат JSON, описание:

  1. На первые два столбца наложены ограничения по содержанию — см. раздел «1.2 Ограничения» выше.
  2. Все столбцы, кроме первых двух, считаются столбцами показателей.
  3. Столбец lltt имеет тип varchar. В примере мы используем COMMENT для обозначения: name=license_template, при этом для столбца lltt будут генерироваться данные типа номерного знака.
  4. Столбец c_arb имеет тип float8. Согласно параметру COMMENT, будут генерироваться случайные значения в диапазоне от 3,5 до 5.
  5. Столбец table1.exttt имеет тип JSON, а его COMMENT: is-ext=true, что означает, он помечен как расширенный столбец показателей, который может содержать несколько простых метрик. Есть два способа определить количество простых метрик:
    • Если columns-descriptions не указан, считываются параметры total-metrics-count и metrics-type из категории Global. Значение total-metrics-count должно быть больше или равно Simple metric columns + 3, то есть расширенный столбец должен содержать как минимум 3 показателей, в противном случае будет выдано сообщение об ошибке.
    • Если columns-descriptions указан и представляет собой корректную строку json array, параметры total-metrics-count и metrics-type из категории Global игнорируются. Количество показателей определяется по параметру columns-descriptions. Пример:
      [
      {"type": "float8", "count": 1, "comment": {"min":  3, "max": 4}},  
      {"type": "float4", "count": 3, "comment": {"min":  2, "max": 3}}, 
      ]

      Таким образом, в данном расширенном столбце содержится 1 показатель типа float8 и 3 показателя типа float4. Также действуют ограничения по диапазону значений.

1.3.2 Реализация через конфигурационные файлы

В этом разделе можно повторно использовать синтаксис columns-description расширенных столбцов, чтобы параметр metrics-descriptions в модуле Global принимал строковое значение. Пример:

[global]
  table-name = "table1"
  metrics-descriptions =  """[
    {"type": "float8", "count": 1000, "comment": {"min": 3, "max": 4}},
    {"type": "float4", "count": 3, "comment": {"min": 2, "max": 3}}
    ]"""

Описание этого параметра означает, что помимо двух фиксированных столбцов (первый и второй), не участвующих в расчёте показателей, таблица table1 содержит 1000 показателей типа float8, 3 показателя типа float4, всего 1003 показателя, что даёт 1005 столбцов — это превышает допустимый лимит количества столбцов в таблице данных (1000 столбцов). Следовательно, согласно логике YMatrix, 6 показателей будут размещены в одном расширенном столбце типа JSON. Таким образом, получаем 997 простых показателей, 2 фиксированных столбца и 1 расширенный столбец (содержащий несколько метрик), что в сумме составляет ровно 1000 столбцов и попадает в пределы поддерживаемой структуры таблицы.

Примечание!
В качестве альтернативы можно использовать параметры --total-metrics-count и ---metrics-type из категории Global, не указывая при этом параметр --metrics-descriptions.

2 Комбинированные запросы

Прямой ввод пользовательских запросов не позволяет динамически задавать значения в операторах SELECT и WHERE на основе особенностей сгенерированных данных, что ограничивает эффективность тестирования запросов. Эта проблема решается с помощью комбинированных запросов.

2.1 Обзор конфигурации

    {
    // The name of the query statement
    "name": "QUERY_NAME",
    // Statements after SELECT
    "projections": {"use-raw-expression": true, "expression": "*"},
    // Expression after SELECT FROM
    "from": {"use-relation-identifier": true, "relation-identifier": "sub-relation-identifier"},
    // Expressions in device identification column-related WHERE statements
    "device-predicate": {"count": 2, "is-random": ture},
    // Timestamp column-related expressions in WHERE statements
    "ts-predicate": {"start": "2022-05-05 01:04:10", "end": "2022-05-05 01:04:10"},
    // Expressions in user metrics related WHERE statements
    "metrics-predicate": {"use-raw-expression": true, "expression": "m1>=37.5"},
    // GROUP BY statement related expressions
    "group-by": {"use-raw-expression": true, "expression": "device_column_name,ts"},
    // ORDER BY statement related expressions
     "order-by": {"user-raw-expression": true, "": "s desc"},
     // LIMIT statement related expressions
     "limit": 3
    },

2.2 Подробное описание

  1. "name"
    Имя данного запроса. Будет отображаться в сводном отчёте по запросам.

  2. "projections"
    По умолчанию не задано. Указывает выражение после SELECT, которое может представлять выборку всех полей ("*") или проекцию по некоторым полям.
    Поддерживает конфигурацию типа JSON.
    Пример использования raw-expression:

    {"use-raw-expression": true, "expression": "*"}
  3. "from"
    Выражение после FROM.
    По умолчанию используется значение table-name, заданное в категории Global, что эквивалентно:

    {
    "use-relation-identifier": true, 
    "relation-identifier": "table-name-in-global-config",
    }

    Прямое использование имени таблицы:

    {
    "use-relation-identifier": true, 
    "relation-identifier": "device_signal_mars2",
    }

    Использование другой таблицы:

    { 
    "relation-statement":
     {
     "projections": {"use-raw-expression": true, "expression": "device_column_name,max(m1) as mp, min(m2), count(m1), avg(m3)"},
     "device-predicate": {"count": 17, "is-random": true},
     "ts-predicate": {"start": "2022-05-05 00:00:00", "end": "2022-05-06 00:00:00"},
     "group-by": {"use-raw-expression": true, "expression": "device_column_name"}
     }
    }
  4. "device-predicate"
    Выражение в операторе WHERE, связанное с номером устройства, поддерживает конфигурацию типа JSON.
    По умолчанию выражение, связанное с номером устройства, в операторе WHERE отсутствует (выборка по всем устройствам).
    Случайный выбор n устройств (n — положительное целое число, в пределах доступного диапазона): например, n = 2, результат конфигурации:

    {
    "count": 2, 
    "is-random": false
    }

    Если n = 1, интерпретируется как запрос равенства, результат конфигурации:

    {
    "count": 1, 
    "is-random": false
    }

    Строка после использования raw-expression: выражение "expression" добавляется непосредственно после WHERE, другие условия объединяются через "AND".

    {
    "use-raw-expression": true, 
    "expression": "device_column_name IN (1234, 4321)"
    }
  5. "ts-predicate"
    Выражение в операторе WHERE, связанное с временной меткой, поддерживает конфигурацию типа JSON.
    По умолчанию выражение по временной метке в операторе WHERE отсутствует (выборка по всему диапазону времени).
    Случайный выбор одной временной точки (в пределах диапазона сгенерированных данных):

    {
    "is-random": true, 
    "duration": 3600  
    }

    Задание начального и конечного времени: предположим, поле временной метки называется ts, будет сгенерировано выражение WHERE ts >= '2022-07-15 18:07:00' AND ts <= '2022-07-15 18:31:17'.

    {
    "start": "2022-07-15 18:07:00", 
    "end": "2022-07-15 18:31:17",
    }

    Эквивалентный запрос: WHERE ts = '2022-07-15 18:07:00'.

    {
    "start": "2022-07-15 18:07:00", 
    "end": "2022-07-15 18:07:00",
    }

    Запрос с открытым интервалом: WHERE ts >= '2022-07-15 18:07:00' AND ts < '2022-07-15 18:31:17'.

    {
    "start": "2022-07-15 18:07:00", 
    "end": "2022-07-15 18:07:00",
    "end-exclusive": true
    }

    Задание псевдонима для поля временной метки: WHERE tttt >= '2022-07-15 18:07:00' AND tttt < '2022-07-15 18:31:17'.

    {
    "has-alias": true,
    "alias": "tttt",
    "start": "2022-07-15 18:07:00", 
    "end": "2022-07-15 18:07:00",
    "end-exclusive": true
    }

    Строка после использования raw-expression: выражение "expression" добавляется непосредственно после WHERE, другие условия объединяются через "AND".

    {
    "use-raw-expression": true, 
    "expression": "ts='2022-07-16 10:31:17'"
    }
  6. "metrics-predicate"
    Выражения в операторе WHERE для фильтрации по метрикам, поддерживает конфигурацию типа JSON.
    По умолчанию фильтрация по метрикам не применяется.
    Строка после использования raw-expression: выражение "expression" добавляется непосредственно после WHERE, другие условия объединяются через "AND".

    {
    "use-raw-expression": true, 
    "expression": "m1>=37.5"
    }
  7. "group-by"
    Оператор GROUP BY, поддерживает конфигурацию типа JSON.
    По умолчанию оператор GROUP BY не добавляется.
    Пример использования raw-expression:

    {
    "use-raw-expression": true, 
    "expression": "device_column_name,ts"
    }
  8. "order-by"
    Оператор ORDER BY, поддерживает конфигурацию типа JSON.
    По умолчанию оператор ORDER BY не добавляется.
    Пример использования raw-expression:

    {
    "user-raw-expression": true, 
    "expression": "s desc"
    }
  9. "limit"
    Принимает положительное целое число.

Примечание!
Полный список параметров командной строки MatrixBench см. в разделе Параметры командной строки MatrixBench; подробное описание информации о ходе выполнения и статистических отчётов MatrixBench — в разделе Понимание информации о ходе выполнения и статистических отчётов MatrixBench.