Основные функции 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 для лучшего соответствия требованиям сценариев автомобильной сети. Тип plate_template используется для генерации столбцов varchar с признаками номерного знака, например: 粤BDM7709. Тип vin_template используется для генерации столбцов varchar с признаками идентификационного номера транспортного средства (VIN), например: 1G1JC124627237595.

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

  • Первый столбец должен быть столбцом временной метки. Имя столбца может быть произвольным, но тип должен быть 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 не указан, читаются параметры Global и total-metrics-count из категории metrics-type. Значение конфигурации total-metrics-count должно быть больше или равно 简单指标列总数 + 3; то есть расширенный столбец должен содержать как минимум 3 метрик; в противном случае возникнет ошибка.
    • Если указан columns-descriptions и это корректная строка json array, параметры Global и total-metrics-count из категории metrics-type становятся недействительными. Количество метрик необходимо определять с помощью параметра 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 столбцов, что попадает в допустимый диапазон количества столбцов таблицы базы данных.

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

2 Составные запросы

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

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

    {
    // Name of this query
    "name": "QUERY_NAME",
    // Expression after SELECT
    "projections": {"use-raw-expression": true, "expression": "*"},
    // Expression after SELECT FROM
    "from": {"use-relation-identifier": true, "relation-identifier": "sub-relation-identifier"},
    // Expression for device identifier column in WHERE clause
    "device-predicate": {"count": 2, "is-random": true},
    // Expression for timestamp column in WHERE clause
    "ts-predicate": {"start": "2022-05-05 01:04:10", "end": "2022-05-05 01:04:10"},
    // Expression for metric-related WHERE clause
    "metrics-predicate": {"use-raw-expression": true, "expression": "m1>=37.5"},
    // Expression for GROUP BY clause
    "group-by": {"use-raw-expression": true, "expression": "device_column_name,ts"},
    // Expression for ORDER BY clause
     "order-by": {"use-raw-expression": true, "expression": "s desc"},
     // Expression for LIMIT clause
     "limit": 3
    },

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

  1. "name"
    Имя запроса. Будет отображаться в сводном отчёте по запросам.
  2. "projections"
    Обязательное поле. Указывает выражение после SELECT. Может быть запросом ко всем полям (“*”) или проекцией выбранных полей.
    Поддерживает конфигурацию типа JSON.
    Пример использования:
    {"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:
    {
    "use-raw-expression": true, 
    "expression": "s desc"
    }
  9. "limit"
    Принимает положительное целое число.

Примечание!
Для получения полной информации о параметрах командной строки MatrixBench см. MatrixBench Command-Line Parameters. За подробностями о сообщениях хода выполнения и статистических отчётах обращайтесь к разделу MatrixBench Understanding Progress Information and Statistical Reports.