Я должен искать все домашние хозяйства с заказами. Я не забочусь о данных порядка вообще, просто что это существует. (Использование SQL Server)
Это более эффективный для высказывания чего-то вроде этого:
SELECT HouseholdID, LastName, FirstName, Phone
FROM Households
INNER JOIN Orders ON Orders.HouseholdID = Households.HouseholdID
или это:
SELECT HouseholdID, LastName, FirstName, Phone
FROM Households
WHERE EXISTS
(SELECT HouseholdID
FROM Orders
WHERE Orders.HouseholdID = Households.HouseholdID)
Два запроса не эквивалентны. Первый вернет несколько результатов, если есть несколько присоединяемых записей. EXISTS, вероятно, будет более эффективным, особенно если нет надежного ограничения FK, которое может использовать оптимизатор.
Подробнее об этом последнем пункте см. Пункт 9 здесь http://www.simple-talk.com/sql/t-sql-programming/13-things-you-should-know-about-statistics -and-the-query-optimizer /
Если это не довольно жесткое соотношение 1: 1 (которое, кажется, не имеет большого смысла с учетом более широкого значения домохозяйств и заказов), ваши запросы будут возвращать разные результаты (если в Заказах будет больше совпадающих строк. стол).
В Oracle (и большинстве СУБД) я ожидал, что версия Exists будет работать значительно быстрее, так как ей нужно найти только одну строку в Order для записи Households, чтобы соответствовать требованиям.
Независимо от СУБД я ожидал, что план объяснения покажет разницу (если таблицы значительно большие, запрос не будет разрешен при полном сканировании таблиц).
Вы пробовали это проверить? Разрешить кеширование?
C.
Как было сказано ранее, ваши запросы будут возвращать разные наборы результатов, если хотя бы один дом имеет более одного заказа.
Вы можете обойти это, используя DISTINCT
, но EXISTS
(или IN
) более эффективен.
См. Эту статью:
В postgres существует быстрее, чем внутреннее соединение.
зависит от механизма базы данных и от того, насколько он эффективен при оптимизации запросов. Хороший зрелый оптимизатор базы данных сделает EXISTS быстрее, другие - нет. Я знаю, что SQL Server может сделать запрос быстрее, в других я не уверен.
Для такого тривиального запроса не будет сюрпризом, если выполнение обоих вариантов сведется к единой форме, которая будет сочтена системой наиболее производительной. Чтобы узнать это, ознакомьтесь с планом выполнения запроса.