В Clickhouse я создал таблицу с вложенной структурой
CREATE TABLE IF NOT EXISTS table_name (
timestamp Date,
str_1 String,
Nested_structure Nested (
index_array UInt32,
metric_2 UInt64,
metric_3 UInt8
),
sign Int8 DEFAULT 1
) ENGINE = CollapsingMergeTree(sign) PARTITION BY (toYYYYMM(timestamp)) ORDER BY (timestamp, str_1)
Запросы, которые я сделаю, будут такими:
SELECT count(*) AS count FROM table_name
WHERE (timestamp = '2017-09-01')
AND
arrayFirst((i, x) -> x = 7151, Nested_structure.metric_2, Nested_structure.index_array) > 50000
Я хочу сосчитать str_1 где: значение столбца (массива) metric_2 в индексе, совпадающем с indexed_array для значения 7151, больше заданного порогового значения (50000)
Мне было интересноесли возможно иметь первичный ключ для столбца: index_array , чтобы сделать запрос быстрее.
Если я добавлю столбец: Nested_structure.index_array в порядке упорядочения предполагается, что это столбец массива большой таблицы, а не отдельные значения столбца indexed_array структуры Nested_structure
например, ORDER BY (timestamp, str_1, Nested_structure.index_array)
Алгоритм:
- Поиск индекса заданного значения в index_array
- Имея индекс из шага (1), получить значение из других массивов
Если index_array отсортирован и вкладкаЕсли он знает об этом, то шаг (1) может быть быстрее (например, использовать алгоритм двоичного поиска)
У кого-то есть идея?
=============
РЕДАКТИРОВАТЬ
Количество столбцов: str_1 15 000 000 миллионов различных значений index_array : 15 000 - 20 000 тысяч различныхзначения
Если предположить, что значения index_array различны: column_1, ..., column_15000, то денормализованная таблица должна иметь следующую структуру:
timestamp,
str_1,
column_1a, <-- store values for metric_2
...
column_15000a, <-- store values for metric_2
column_1b, <-- store values for metric_3
...
column_15000b, <-- store values for metric_3
@ Amos mayВы дадите мне структуру таблицы, если я использую столбец типа LowCardinality ?