В этом документе подробно описываются некоторые базовые функции MatrixBench, включая следующие разделы:
Примечание!
В настоящее время mxbench является проектом с открытым исходным кодом, мы приветствуем ваш отзыв и вклад. Пожалуйста, нажмите здесь, чтобы ознакомиться с файлом README.
Примечание!
Из-за специфики временных сценариев mxbench требует, чтобы первый столбец таблицы данных был столбцом временной метки (timestamp), второй столбец — идентификатором устройства, а начиная с третьего столбца — располагались показатели, в которые можно записывать пользовательские данные. В настоящее время поддержка нескольких типов данных и функций характеристик доступна только для столбцов показателей, то есть начиная с третьего столбца.
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.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 не указан, считываются параметры 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. Также действуют ограничения по диапазону значений.
В этом разделе можно повторно использовать синтаксис 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.
Прямой ввод пользовательских запросов не позволяет динамически задавать значения в операторах SELECT и WHERE на основе особенностей сгенерированных данных, что ограничивает эффективность тестирования запросов. Эта проблема решается с помощью комбинированных запросов.
{
// 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
},
"name"
Имя данного запроса. Будет отображаться в сводном отчёте по запросам.
"projections"
По умолчанию не задано. Указывает выражение после SELECT, которое может представлять выборку всех полей ("*") или проекцию по некоторым полям.
Поддерживает конфигурацию типа JSON.
Пример использования raw-expression:
{"use-raw-expression": true, "expression": "*"}
"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"}
}
}
"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)"
}
"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'"
}
"metrics-predicate"
Выражения в операторе WHERE для фильтрации по метрикам, поддерживает конфигурацию типа JSON.
По умолчанию фильтрация по метрикам не применяется.
Строка после использования raw-expression: выражение "expression" добавляется непосредственно после WHERE, другие условия объединяются через "AND".
{
"use-raw-expression": true,
"expression": "m1>=37.5"
}
"group-by"
Оператор GROUP BY, поддерживает конфигурацию типа JSON.
По умолчанию оператор GROUP BY не добавляется.
Пример использования raw-expression:
{
"use-raw-expression": true,
"expression": "device_column_name,ts"
}
"order-by"
Оператор ORDER BY, поддерживает конфигурацию типа JSON.
По умолчанию оператор ORDER BY не добавляется.
Пример использования raw-expression:
{
"user-raw-expression": true,
"expression": "s desc"
}
"limit"
Принимает положительное целое число.
Примечание!
Полный список параметров командной строки MatrixBench см. в разделе Параметры командной строки MatrixBench; подробное описание информации о ходе выполнения и статистических отчётов MatrixBench — в разделе Понимание информации о ходе выполнения и статистических отчётов MatrixBench.