MergeTree meter_values_buffer, где один из индекс - числовой StationId
Есть отдельно БД Postgres, где есть соответствие строкового identity к этому StationId. Набор пар StationId->identity небольшой. Оба значения в БД уникальны, так что можно identity->StationId сделать, если надо
Сейчас есть выборка из таблицы meter_values_buffer, куда в WHERE входит StationId, данные забираются из Clickhouse молниеносно
Задача: заменить StationId на identity в WHERE, не теряя в производительности, чтобы можно было фильтровать сущности по identity
Я создал flat() dictionary с названием station_identities из данных Postgres, который хранит StationId -> identity. Попробовал сделать meter_values_buffer RIGHT JOIN id_map по StationId, но WHERE отрабатывает фантастически медленно, даже если делать WHERE по StationId
Запросы: https://pastebin.com/FEL25L7F
Куда можно копнуть для того, чтобы в WHERE заменить StationId на identity без добавления отдельного столбца с ним?
не надо делать join со словарями. Только dictGet. https://pastebin.com -- дохера рекламы, прямо елка новогодняя pastila.nl -- нету рекламы https://fiddle.clickhouse.com/ -- нету рекламы
чувствую что можно запилить типа where .... = dictGet ....
О, поковырялся, вот так вот получилось и работает очень быстро, в том числе выдаётся доступ только к записям, у которых есть StationId в словаре: CREATE VIEW v_tst AS SELECT Time, Value, LocationType, FieldType, UnitId, StationId, dictGetOrNull('station_identities', 'StationIdentity', StationId) as StationIdentity FROM meter_values_buffer WHERE dictHas('station_identities', StationId);
И прям StationIdentity можно потом использовать в SELECT над v_tst
Обсуждают сегодня