Какое количество строк вернет CROSS JOIN для таблиц с 100 и 10 записями
Что проверяют
Понимаете ли вы, что CROSS JOIN это декартово произведение, и умеете ли прикинуть размер результата до запуска. Для data-специальности следом спрашивают, где такое соединение полезно и как оно случайно появляется в запросе.
Как отвечать
Ответ: 1000 строк. Каждая из 100 строк первой таблицы соединяется с каждой из 10 строк второй, условия нет, поэтому результат равен произведению 100 × 10. Дубли и NULL на это не влияют, а если одна из таблиц пуста, результат пустой.
Дальше покажите, что понимаете последствия:
- рост мультипликативный: три таблицы по миллиону строк дадут 10¹⁸ строк. Это произведение, а не экспонента, но уже две большие таблицы легко выходят за память и диск;
- где полезно: сетка «все даты × все товары», к которой потом делают
LEFT JOINфактов, чтобы дни без продаж стали нулями, а не пропали. Так же строят комбинации гиперпараметров. В pandas этоdf1.merge(df2, how="cross"), в PySparkdf1.crossJoin(df2); - как появляется случайно: таблицы через запятую без
WHERE, условиеON 1 = 1, опечатка в условии, которая всегда истинна. Похожий эффект даёт соединение по неуникальному ключу: по 1000 строк с одним значением ключа с каждой стороны дадут миллион; - связь с другими соединениями:
CROSS JOINс фильтром вWHEREпо смыслу обычный внутренний, и планировщик часто так его и выполняет.
Размер проверяют заранее через COUNT(*) по каждой стороне и по ключам соединения, а в Spark смотрят план через explain(): там видно CartesianProduct или BroadcastNestedLoopJoin.
Где спотыкаются
Отвечают 110, складывая количества, или 100, путая с LEFT JOIN.
Говорят, что число строк растёт экспоненциально. Для двух таблиц это произведение, и на собеседовании по данным путать термины не стоит.
Не узнают декартово произведение в обычном JOIN по неуникальному ключу и потом ищут, откуда в витрине дубли и завышенные суммы.