Есть две таблицы с общим ключем (формата uid, значения случайны). Фактически - половина данных о событии находится в одной таблице, половина - в другой. Таблицы - большие, на сотни гигабайт. Общий столбец в primary key не включен.
Пробовал сделать JOIN - получил крайне медленную работу и падение из-за недостатка памяти.
1. Правильно ли я понимаю, что если JOIN таблицы аналогичен JOIN'у subquery, то единственный способ сделать его с учетом доступной памяти - это делать последовательно много запросов, используя subquery и ограничивая объем subquery, например, по uid % 10 = X - получая по 1/10 части данных каждый раз?
2. Имеет ли значение отсутствие uid в primary key? Ускорит ли JOIN добавление его в ключ? Будет ли при этом иметь значение порядок столбцов в ключе? Сейчас он не в ключе, потому что для нормальных запросов значения вообще не имеет, и сортировать по нему совсем бессмысленно - это просто случайная уникальная (с достаточной вероятностью :) ) строка.
И пара вопросов по MATERIALIZED VIEW
1. Я правильно понимаю, что из VIEW данные уже не удалятся - при удалении исходной таблицы, или ее переименовании, или при detach partition?
2. VIEW привязан к талицам именно по названию? Что произойдет, если пересоздать исходную таблицу?
3. Можно ли использовать UNION в исходных запросах для VIEW? Иными словами, можно ли "смерджить" две таблицы через VIEW?
4. Можно ли сделать MATERIALIZED_VIEW над MATERIALIZED_VIEW? А если сделать VIEW типа AggretagingMergeTree над VIEW типа AggretagingMergeTree? Я столкнулся с какими-то странными ошибками, не могу понять, это моя неопытность или слишком сложная конфигурация.
Ну и напоследок: все эти вопросы появились из-за проблемы в начале письма - есть две таблицы, которые представляют из себя неравные половинки одного события. Есть ли какие-то оптимальные способы, как их можно объединить в одну таблицу?
Из-за объема данных и формата - просто независимые логи сервисов - объединять в генерирующем источнике проблематично.