оптимизация условного оператора в sql - PullRequest
2 голосов
/ 06 января 2011
select Item 
into #transferTheseItems
from IDTable where id = @myCondition

if exists (select 1 from #transferTheseItems)
/*
insert this huge data to a remote database over linked server
*/

хотя в temp нет записи, выполнение запроса занимает слишком много времени.

Я тоже пробовал

if not exists (select 1 from #transferTheseItems)
return

но ничего не изменилось.

Я думаю, что сервер sql пытается проанализировать часть, которую он никогда не выполнит.

Есть ли способ пропустить это?

Ответы [ 3 ]

1 голос
/ 06 января 2011

Может быть, вам это поможет:

select Item 
into #transferTheseItems
from IDTable where id = @myCondition

IF @@ROWCOUNT > 0
    ....
ELSE
    ....
0 голосов
/ 06 января 2011

Мне интересно, если perhps вы намеревались иметь более одного оператора в блоке IF, и забыли использовать BEGIN и END, чтобы оставить их в блоке IF.Даже для большого запроса создание плана выполнения не должно занимать много времени, а выполнение запроса обычно занимает больше всего времени.Однако при использовании условной обработки только первая оценка после if является частью IF, если вы не укажете другое, используя блоки BEGIN и END.Даже когда я намереваюсь поместить только один параметр в IF, если я использую BEGIN и END для обеспечения устойчивости, потому что это тонкая ошибка, которую трудно обнаружить, просто сканируя код.

0 голосов
/ 06 января 2011

Наконец я понял;

попробуйте это

if 1 = 0
select * from a
join b on a.ID = b.ID
join c on c.ID = b.ID

Для первого выполнения запрос требует времени, даже если ваш сложный запрос не будет выполнен.Потому что sql генерирует «план выполнения».

запустите его снова, и вы увидите, что это почти не занимает времени.Потому что SQL Server сохранил план выполнения для этого запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...