Медленный запрос при использовании в качестве подзапроса EXISTS - PullRequest
4 голосов
/ 04 октября 2011

У меня следующий запрос:

SELECT I.InsuranceID
FROM Insurance I
INNER JOIN JobDetail JD ON I.AccountID = JD.AccountID
WHERE I.InsuranceLookupID IS NULL
AND JD.JobID = 28

Выполняется примерно за секунду. При использовании в качестве подзапроса следующим образом:

IF EXISTS(
SELECT I.InsuranceID
FROM Insurance I
INNER JOIN JobDetail JD ON I.AccountID = JD.AccountID
WHERE I.InsuranceLookupID IS NULL
AND JD.JobID = 28
)
SELECT 1
ELSE
SELECT 0

Требуется 90 секунд. Насколько я понимаю, EXISTS должен быть оптимизирован для остановки после нахождения первой записи. Почему это займет больше времени?

1 Ответ

4 голосов
/ 04 октября 2011

Я видел это сам.

Я могу предположить, что EXISTS лучше в предложении WHERE, потому что он дает полусоединение, основанное на множестве, и именно то, что вам нужно.

В случае IF это не ясно оптимизатору. То есть полусоединения тоже нечего. Надеюсь, это должно быть то же самое (плохо):

SELECT 1 WHERE EXISTS (SELECT I.InsuranceID
    FROM Insurance I
    INNER JOIN JobDetail JD ON I.AccountID = JD.AccountID
    WHERE I.InsuranceLookupID IS NULL
    AND JD.JobID = 28)

Вы могли бы к этому, хотя

SELECT SIGN(COUNT(*))
FROM Insurance I
INNER JOIN JobDetail JD ON I.AccountID = JD.AccountID
WHERE I.InsuranceLookupID IS NULL
AND JD.JobID = 28

Оптимизируется при некоторых обстоятельствах:
Что лучше проверить, если элемент существует или нет: Выберите Количество (ID) ИЛИ Существуйте (...)?

Не уверен, что смущает оптимизатор ...

...