СОЕДИНЕНИЕ больше/меньше эффективно, чем СУЩЕСТВУЕТ В ТОМ, когда никакие данные не необходимы от второй таблицы?

Я должен искать все домашние хозяйства с заказами. Я не забочусь о данных порядка вообще, просто что это существует. (Использование 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
задан Johan 22 March 2010 в 12:36
поделиться

6 ответов

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

Подробнее об этом последнем пункте см. Пункт 9 здесь http://www.simple-talk.com/sql/t-sql-programming/13-things-you-should-know-about-statistics -and-the-query-optimizer /

3
ответ дан 10 December 2019 в 00:36
поделиться

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

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

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

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

C.

4
ответ дан 10 December 2019 в 00:36
поделиться

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

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

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

1
ответ дан 10 December 2019 в 00:36
поделиться

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

0
ответ дан 10 December 2019 в 00:36
поделиться

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

2
ответ дан 10 December 2019 в 00:36
поделиться

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

0
ответ дан 10 December 2019 в 00:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: