Основные функции 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 используется для генерации столбца характеристик типа VIN-номера (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, результат конфигурации: WHERE <device_column_name> IN (<random_device_id1>, <random_device_id2>).

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

    Если n = 1, запрос интерпретируется как равенство, и генерируется следующая конфигурация: WHERE <device_column_name>=<random_device_id>.

    {
    "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.