У меня есть запрос ниже:
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
Вышеуказанный запрос завершается за три секунды.
Если приведенный выше запрос возвращает какое-либо значение, мы хотим, чтобы хранимая процедура завершила работу, поэтому я переписал его, как показано ниже:
If Exists(
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
)
Begin
Raiserror('Source missing',16,1)
Return
End
Однако это занимает 10 минут.
Я могу переписать вышеуказанный запрос, как показано ниже, который также выполняется менее чем за 3 секунды:
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source
if @@rowcount >0
Begin
Raiserror('Source missing',16,1)
Return
End
Проблема с перезаписью выше заключается в том, что указанный выше запрос является частью более крупной хранимой процедуры и возвращает несколько наборов результатов. В C # мы перебираем каждый набор результатов и выполняем некоторую обработку.
Вышеприведенное возвращает пустой набор результатов, поэтому, если я пойду с этим подходом, мне придется изменить свой C # и снова выполнить развертывание.
Итак, мой вопрос,
почему использование просто
IF EXISTS
меняет план так долго?
Ниже приведены подробности, которые могут вам помочь, и дайте мне знать, если вам нужны какие-либо подробности:
- Создайте скрипт таблицы и статистики, чтобы получить тот же план, что и у меня
- План медленного исполнения
План быстрого исполнения
Медленный план с помощью Brentozar Вставить план
Быстрый план с помощью Brentozar Вставить план
Примечание: оба запроса одинаковы (с использованием параметров), единственное отличие состоит в том, что EXISTS
(возможно, я допустил некоторые ошибки при анонимизации).
Скрипты создания таблицы приведены ниже:
http://pastebin.com/CgSHeqXc - статистика малых таблиц
http://pastebin.com/GUu9KfpS - статистика больших таблиц