В этом документе подробно рассматриваются некоторые базовые функции MatrixBench, включая следующие темы:
Примечание!
mxbench теперь является проектом с открытым исходным кодом. Мы приветствуем ваши отзывы и вклад. Пожалуйста, нажмите здесь, чтобы ознакомиться с файлом README.
Примечание!
Из-за специфики сценариев временных рядов mxbench требует, чтобы первый столбец таблицы данных был столбцом временной метки (timestamp), а второй — столбцом идентификатора устройства. Пользовательские метрики данных могут начинаться только с третьего столбца. В настоящее время функция поддержки различных типов данных и характеристик применяется только к столбцам метрик, то есть к столбцам, начиная с третьего.
int4, int8, float4 и float8, поддерживаются также такие типы, как text и varchar.int4, int8, float4 и float8 могут дополнительно указывать характеристики данных, например диапазон значений.varchar предоставляет специальные подтипы plate_template и vin_template для лучшего соответствия требованиям сценариев автомобильной сети. Тип plate_template используется для генерации столбцов varchar с признаками номерного знака, например: 粤BDM7709. Тип vin_template используется для генерации столбцов varchar с признаками идентификационного номера транспортного средства (VIN), например: 1G1JC124627237595.timestamp или timestamptz.text, varchar или int8.Существует два способа настройки множественных метрик, различных типов данных и диапазонов значений в mxbench.
После создания таблицы в 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. Примечания:
lltt имеет тип varchar. В примере он помечен с помощью COMMENT: name=license_template, что приведёт к генерации данных, похожих на номерные знаки, для lltt.c_arb имеет тип float8. Согласно COMMENT, будут генерироваться случайные данные в диапазоне от 3,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, каждая со своими ограничениями по диапазону значений.
В этом разделе можно повторно использовать синтаксис расширенного столбца 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.
Прямой ввод пользовательских запросов не позволяет динамически задавать значения в секциях SELECT или WHERE на основе сгенерированных характеристик данных, что ограничивает эффективность тестирования запросов. Составные запросы решают эту проблему.
{
// 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
},
SELECT. Может быть запросом ко всем полям (“*”) или проекцией выбранных полей.JSON.{"use-raw-expression": true, "expression": "*"}
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"}
}
}
JSON.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)"
}
JSON.{
"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'"
}
JSON.raw-expression: строка после "expression" непосредственно добавляется после WHERE. Комбинируется с другими условиями через "AND".{
"use-raw-expression": true,
"expression": "m1>=37.5"
}
GROUP BY. Поддерживает конфигурацию типа JSON.GROUP BY.raw-expression:{
"use-raw-expression": true,
"expression": "device_column_name,ts"
}
ORDER BY. Поддерживает конфигурацию типа JSON.ORDER BY.raw-expression:{
"use-raw-expression": true,
"expression": "s desc"
}
Примечание!
Для получения полной информации о параметрах командной строки MatrixBench см. MatrixBench Command-Line Parameters. За подробностями о сообщениях хода выполнения и статистических отчётах обращайтесь к разделу MatrixBench Understanding Progress Information and Statistical Reports.