sql-движок будет использовать HashJoin, если такой запрос:
select * from table1 t1 left join table2 t2 on t1.id = t2.id;
это хорошо. но если запрос такой:
select * from table1 t1 left join table2 t2 on t1.id > t2.id;
как с этим справиться?
соединение nestedloop будет работать, но есть ли лучший способ?
@TimBiegeleisen о, я изучаю prestodb. вопрос пришел ко мне внезапно сегодня. Итак, как движок sql справляется с этим условием?
Это зависит от запроса, данных, индексов и т. д. Индекс B-дерева должен по-прежнему использоваться с неравенством.
Возможно, вас заинтересует этот ТАК ответ. В Википедии есть запись о процитированном алгоритме сортировка-слияние-соединение.






Для распределенного SQL выполнение прямого неквалифицированного соединения (t1.id > t2.id) довольно дорого. Если одна сторона мала, вы выполняете широковещательную рассылку, а затем используете отсортированный индекс на каждом узле. Если обе стороны велики, вы можете ранжировать первую секцию и построить отсортированный индекс, а затем реплицировать другие строки в любой диапазон, который может совпадать.
Обычно у вас есть комбинация равенства и неравного соединения, например t1.id = t2.id and t1.cost < t2.cost. В этом случае вы можете выполнить обычное распределенное хеш-соединение, а затем сохранить отсортированный список вторичных элементов для выполнения неравной части. Это то, что делает Presto.
MySQL, если я правильно помню, не поддерживает даже хеш-индексы. Но какую базу данных вы на самом деле используете?