Дилемма объединений / подзапросов - PullRequest
1 голос
/ 05 марта 2012

Я сталкивался с несколькими случаями, когда я мог написать запрос, используя как соединения, так и подзапросы.Я обычно использую соединения, но иногда использую подзапросы (без всякой причины).Я читал в нескольких местах (включая stackoverflow), что во многих случаях соединения выполняются быстрее, чем подзапросы, но иногда подзапросы выполняются быстрее.Прямо сейчас запросы, которые я пишу, не имеют дело с большим количеством данных, поэтому я думаю, что скорость не сильно беспокоит.Но в будущем мне интересно следующее:

a.) Почему объединения выполняются быстрее, чем подзапросы (в целом).

b.) В каких случаях подзапросы выполняются быстрее.Как я узнаю?

в.) Если я пишу запрос, как мне определить, следует ли мне использовать подзапрос или объединение.Буду признателен, если кто-нибудь объяснит мне пример.

Ответы [ 3 ]

3 голосов
/ 05 марта 2012

Сказать, что объединения «в основном быстрее», чем подзапросы, неверно. Это полностью зависит от используемой СУБД.

Для Microsoft SQL Server я знаю, что это не так. Обычно производительность одинакова. Не только в теории, но и на практике.

Для MySQL я слышал, что подзапросы проблематичны. У меня нет личных доказательств.

Oracle выглядит примерно так же, как SQL Server.

2 голосов
/ 05 марта 2012

Ответы на ваши вопросы.

a) Объединения не быстрее, чем подзапросы (в целом).Но часто СУБД выдают гораздо более умный план выполнения, если вы используете соединения.Это связано с процедурой преобразования запросов в планы выполнения.

б) в) Как правило, правила написания быстрых запросов отсутствуют.Кроме того, есть только один способ выбрать правильный запрос для вашей задачи: вы должны сравнить различные версии.Так что если вам нужно решить, как сформулировать определенный тестовый запрос первым и если он работает хорошо, остановитесь.В противном случае измените что-либо и сравните это снова, и если все в порядке, остановитесь.Используйте среду, близкую к вашей производственной среде: используйте реалистичные наборы данных.Запрос может хорошо работать с тысячами записей, но не с миллионами.Используйте то же оборудование, что и на производстве.Попробуйте сравнить запрос в контексте вашего приложения, так как другие запросы могут повлиять на его производительность.

1 голос
/ 05 марта 2012

Основная причина проведенного мною исследования заключается в том, что компилятор более непосредственно использует правильные индексы, когда вы явно указываете, как выполнить соединение (т. Е. Левое соединение, внутреннее соединение и т. Д.) Если вы используете подзапросВы оставляете это немного на усмотрение оптимизатора, и он не всегда делает самый быстрый путь (который называется «оптимизатором»).

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

Вот несколько ссылок с некоторыми представлениями и примерами:

Присоединение к подзапросу

Другая ссылка Эти ссылки дают некоторыеподробно, почему объединения выполняются быстрее (в большинстве случаев), чем подзапросы.

больше примеров

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...