Как движок sql обрабатывает запрос на соединение с неравным?

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 будет работать, но есть ли лучший способ?

MySQL, если я правильно помню, не поддерживает даже хеш-индексы. Но какую базу данных вы на самом деле используете?

Tim Biegeleisen 13.07.2018 17:09

@TimBiegeleisen о, я изучаю prestodb. вопрос пришел ко мне внезапно сегодня. Итак, как движок sql справляется с этим условием?

lovezhy 13.07.2018 17:15

Это зависит от запроса, данных, индексов и т. д. Индекс B-дерева должен по-прежнему использоваться с неравенством.

Tim Biegeleisen 13.07.2018 17:17

Возможно, вас заинтересует этот ТАК ответ. В Википедии есть запись о процитированном алгоритме сортировка-слияние-соединение.

collapsar 13.07.2018 17:20
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
73
1

Ответы 1

Для распределенного SQL выполнение прямого неквалифицированного соединения (t1.id > t2.id) довольно дорого. Если одна сторона мала, вы выполняете широковещательную рассылку, а затем используете отсортированный индекс на каждом узле. Если обе стороны велики, вы можете ранжировать первую секцию и построить отсортированный индекс, а затем реплицировать другие строки в любой диапазон, который может совпадать.

Обычно у вас есть комбинация равенства и неравного соединения, например t1.id = t2.id and t1.cost < t2.cost. В этом случае вы можете выполнить обычное распределенное хеш-соединение, а затем сохранить отсортированный список вторичных элементов для выполнения неравной части. Это то, что делает Presto.

Другие вопросы по теме