GLOBAL JOIN двух Distributed-таблиц на стенде #129
Notifications
Due Date
No due date set.
Blocks
#133 Сборка identity_map: трансформация и повторы
ddmitry/clickstream-data-platform
Reference: ddmitry/clickstream-data-platform#129
Reference in new issue
Block a user
Part of #127.
Вопрос
Как ведёт себя соединение двух Distributed-таблиц на нашем кластере: где
выполняется JOIN, что даёт
GLOBALдля правой части, как влияетdistributed_product_mode— и что из этого следует для двух построекэтапа 4: сборки
dds.identity_map(заказы подтягиваются через GLOBALJOIN, спека §5) и витрины сверки
purchase_vs_orders_v(FULL OUTER GLOBAL JOIN, спека §7).
Это хвост раздела 11 мастер-спеки («эмпирически на стенде», остаток #14).
Как проверять
Distributed-таблицам событий и заказов:
EXPLAINи живое соединениена малом срезе; смотреть, куда уходят подзапросы
(
system.query_log— чтение, не запись).GLOBAL JOIN,distributed_product_mode, ко-локация по ключу шардирования.Сначала прочитать
docs/architecture/storage.md, раздел «Раскладка по шардам».Проверено на живом стенде (26.3.17.56, читающие запросы, следы в system.query_log по log_comment r129-*) и по документации ClickHouse через Context7.
Вывод: обычный JOIN/IN двух Distributed режется заводским distributed_product_mode='deny'; GLOBAL собирает правую часть один раз на инициаторе и рассылает временную таблицу data* на шарды (видно в журнале второй ноды); режим local верен только при настоящей ко-локации, иначе молча занижает ответ. Подзапрос слева переносит всё соединение на инициатор — GLOBAL и режим тогда ни на что не влияют. FULL OUTER с голой левой Distributed задваивает непарные строки правой части (по разу с шарда); с подзапросами с обеих сторон — верно, и purchase_vs_orders_v это условие выполняет естественно. Для identity_map GLOBAL JOIN заказов корректен и дёшев.
Попутная находка: ко-локация заказов по cityHash64(order_id) сломана — 1189 из 1662 заказов лежат на обоих шардах, count() по ods.order_dist даёт 2851 при 1662 заказах. Причина — заводское parallel_distributed_insert_select=2: INSERT…SELECT из Distributed в Distributed пишется локально на шардах, и заказы унаследовали раскладку сырья. События целы. Починка — отдельным тикетом.
Заметка: docs/research/2026-08-22-distributed-join.md, влита в main (PR #140).