Понимание того, когда использовать подзапрос над объединением - PullRequest
0 голосов
/ 04 июня 2018

Кажется, я что-то упустил.Я продолжаю читать, что в большинстве статей, которые я читаю, вы должны использовать объединение вместо подвыбора.Однако проведение быстрого эксперимента само по себе показывает большой выигрыш для подзапроса, когда дело доходит до времени выполнения.

Попытка получить все имена людей, которые сделали ставку (я предполагаю, что таблицы говорят сами за себя) приводит к следующему.

Это объединение занимает 10 секунд

select U.firstname
from Bid B
inner join [User] U on U.userName = B.[user]

Этот запрос с подзапросом занимает 3 секунды

select firstname
from [User]
where userName in (select [user] from bid)

Почему мой эксперимент не вСтрока с тем, что я продолжаю читать везде или я что-то упускаю?

Экспериментируя, я обнаружил, что время выполнения одинаково после добавления различных к обоим.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Хорошее чтение для подзапроса против внутреннего присоединения
https://www.essentialsql.com/subquery-versus-inner-join/

0 голосов
/ 04 июня 2018

Они не одно и то же.В запросе с объединениями можно потенциально умножить строки или полностью удалить строки из результатов.

Внутреннее объединение удаляет строки на несопоставленных ключах.Он также умножает строки на любых совпадающих ключах, которые повторяются в одной или обеих объединяемых таблицах.Внутреннее соединение для этого проходит дополнительный этап умножения и удаления строк.

Используемый вами подзапрос - SELECT.Поскольку нет фильтров, использующих WHERE, это так же просто, как простой SELECT, и поскольку нет никаких объединений, вы получите результаты так же быстро, как их можно выбрать.

Некоторые могут утверждать, что Внешние объединения возвращают значения NULL, аналогичныеподзапросы - но они все еще могут умножать строки.Следовательно, подзапросы и объединения не одно и то же.

В предоставленных вами запросах вы хотите использовать второй запрос (тот, который содержит подзапрос), поскольку он не умножает и не удаляет строки.

...