Первичный ключ во вложенной структуре в базе данных clickhouse - PullRequest
0 голосов
/ 18 декабря 2018

В 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)

Алгоритм:

  1. Поиск индекса заданного значения в index_array
  2. Имея индекс из шага (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 ?

1 Ответ

0 голосов
/ 20 декабря 2018

Мне было интересно, возможно ли иметь первичный ключ для column: index_array, чтобы сделать запрос быстрее.

Нет, у ClickHouse нет индексов массива.Если вы укажите Nested_structure.index_array в качестве третьего аргумента в предложении order by, он просто упорядочит всю строку с учетом столбца массива.Обратите внимание, [1,2] < [1,2,3].

Вы можете просто денормализовать таблицу без вложенного столбца и создать первые два столбца с типом LowCardinality, который почти готов к производству.

Обновление

Похоже, вы не получите много пользы от LowCardinality типов.Я имел в виду что-то вроде этого

CREATE TABLE IF NOT EXISTS table_name (
    timestamp Date,
    str_1 String,
    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, index_array)

И вы все еще можете использовать старую логику вставки, выполнив это

CREATE TABLE IF NOT EXISTS table_name ( timestamp Date, str_1 String, 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, index_array)

CREATE TABLE IF NOT EXISTS source_table ( timestamp Date, str_1 String, Nested_structure Nested ( index_array UInt32, metric_2 UInt64, metric_3 UInt8 ), sign Int8 DEFAULT 1 ) ENGINE Null;

create materialized view data_pipe to table_name as select timestamp, str_1, Nested_structure.index_array index_array, Nested_structure.metric_2 metric_2, Nested_structure.metric_3 metric_3, sign from source_table array join Nested_structure;

insert into source_table values (today(), 'fff', [1,2,3], [2,3,4], [3,4,5], 1);
...