Я создал простой запрос, аналогичный приведенному в вопросе на MSSQL2005, и планы объяснения были другими. Первый запрос выглядит быстрее. Я не эксперт по SQL, но предполагаемый план объяснения содержал 37% для запроса 1 и 63% для запроса 2. Похоже, что самая большая стоимость запроса 2 - это объединение. Оба запроса имели две таблицы сканирования.
отрим следующие 2 запроса:
select tblA.a,tblA.b,tblA.c,tblA.d
from tblA
where tblA.a not in (select tblB.a from tblB)
select tblA.a,tblA.b,tblA.c,tblA.d
from tblA left outer join tblB
on tblA.a = tblB.a where tblB.a is null
Что будет лучше? Я предполагаю, что в целом объединение будет лучше, за исключением случаев, когда подвыбор возвращает очень маленький набор результатов.