Является ли JOIN более / менее эффективным, чем EXISTS IN, когда данные из второй таблицы не нужны? - PullRequest
6 голосов
/ 22 марта 2010

Мне нужно найти все домохозяйства с заказами.Меня не волнуют данные заказа, только то, что он существует.(С использованием 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)

Ответы [ 6 ]

4 голосов
/ 22 марта 2010

Если это не довольно жесткие отношения 1: 1 (которые, по-видимому, не имеют особого смысла, учитывая более широкий смысл домохозяйств и заказов), ваши запросы будут возвращать разные результаты (если в Заказах больше совпадающих строк таблицу).

В Oracle (и в большинстве СУБД) я ожидаю, что версия Exists будет работать значительно быстрее, поскольку для определения записи домохозяйств требуется только одна строка в Заказах.

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

Вы пытались его протестировать? Разрешить кеширование?

С

3 голосов
/ 22 марта 2010

2 запроса не эквивалентны. Первый из них выдаст несколько результатов, если имеется несколько записей о присоединении. СУЩЕСТВУЮЩИЙ, вероятно, будет более эффективным, особенно если не существует доверенного ограничения FK, которое может использовать оптимизатор.

Подробнее об этом последнем пункте см. В пункте 9 здесь http://www.simple -talk.com / sql / t-sql-программирование / 13 вещей, которые вы должны знать о статистике и -query-оптимизатор /

2 голосов
/ 22 марта 2010

зависит от механизма базы данных и его эффективности при оптимизации запросов.Хороший зрелый оптимизатор базы данных сделает EXISTS быстрее, другие - нет.Я знаю, что SQL Server может сделать запрос быстрее, в других я не уверен.

1 голос
/ 22 марта 2010

Как было сказано ранее, ваши запросы будут возвращать разные наборы результатов, если хотя бы в одном доме будет более одного заказа.

Вы можете обойти это, используя DISTINCT, но EXISTS (или * 1005).*) более эффективен.

См. эту статью:

0 голосов
/ 22 марта 2010

В postgres существование будет быстрее, чем внутреннее соединение.

0 голосов
/ 22 марта 2010

Для такого тривиального запроса неудивительно, что выполнение обоих вариантов сводится к одной форме, которая будет признана самой производительной системой.Проверьте план выполнения запроса, чтобы узнать.

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