У меня есть следующий SQL:
IF EXISTS
(
SELECT
1
FROM
SomeTable T1
WHERE
SomeField = 1
AND SomeOtherField = 1
AND NOT EXISTS(SELECT 1 FROM SomeOtherTable T2 WHERE T2.KeyField = T1.KeyField)
)
RAISERROR ('Blech.', 16, 1)
Таблица SomeTable
имеет около 200 000 строк, а таблица SomeOtherTable
имеет одинаковую.
Если я выполняю внутренний SQL (SELECT
), он выполняется в суб-второй раз, не возвращая строки. Но если я выполняю весь script (IF...RAISERROR
), то он занимает более часа. Почему?
Теперь, очевидно, план выполнения отличается - я вижу это в Enterprise Manager, но опять же, почему?
Я мог бы, вероятно, сделать что-то вроде SELECT @num = COUNT(*) WHERE
... и затем IF @num > 0 RAISERROR
, но... Я думаю, что немного не хватало точки. Вы можете кодировать только ошибку (и это наверняка похоже на ошибку), если вы знаете, что она существует.
ИЗМЕНИТЬ
Я должен упомянуть, что я уже пробовал перетащить запрос в OUTER JOIN в соответствии с ответом @Bohemian, но это не имело никакого значения для времени выполнения.
РЕДАКТИРОВАТЬ 2:
Я приложил план запроса для внутреннего оператора SELECT
:
... и план запроса для всего блока IF...RAISERROR
:
Очевидно, что они отображают реальные имена таблиц и полей, но, кроме того, запрос точно такой, как показано выше.