Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как sql компилирует и хранит план, если много if и как влияет return  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
В процедуре несколько if, но без else.
Идут подряд.

if @flag = 1
begin

end;

if @flag = 2
begin

end;

if @flag = 3
begin

end;

Как в этом случае ведет себя компилятор: а) если указывать в каждом блоке return б) если не указывать.
28 фев 18, 17:58    [21225931]     Ответить | Цитировать Сообщить модератору
 Re: Как sql компилирует и хранит план, если много if и как влияет return  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
_Промешан_,

скомпилирует как все

посмотреть вам было быстрее чем писать...
28 фев 18, 18:05    [21225969]     Ответить | Цитировать Сообщить модератору
 Re: Как sql компилирует и хранит план, если много if и как влияет return  [new]
если указывать в каждом
Guest
_Промешан_,

автор
Как в этом случае ведет себя компилятор

Срывается в Геленджик на попутках.

Взаимоисключащие IFы без ELSE - выстрел и себе в ногу и в мозг компилятора. Потом сиди, разбирай, могут ли эти блоки вызываться после предыдущих.

Если где-то что-то указывать, то скомпилируется с указанием указанного. Если не указывать что-то - оно не попадет в скомпилированный результат, потому как не существует. В поисках мистической оптимизации можно подумать на предмет, под какой же @flag компилятор сделает план. Во время компиляции переменная какое значение имеет? А во время выполнения?
28 фев 18, 18:37    [21226052]     Ответить | Цитировать Сообщить модератору
 Re: Как sql компилирует и хранит план, если много if и как влияет return  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
если указывать в каждом,

не ясно что за бред вы пишете, но в кеше планов будет даже кусок


if 1 = 3
begin
	SELECT top 1 * FROM master..spt_values
	RETURN
end;
28 фев 18, 18:39    [21226061]     Ответить | Цитировать Сообщить модератору
 Re: Как sql компилирует и хранит план, если много if и как влияет return  [new]
если указывать в каждом
Guest
TaPaK
если указывать в каждом,

не ясно что за бред вы пишете, но в кеше планов будет даже кусок


if 1 = 3
begin
	SELECT top 1 * FROM master..spt_values
	RETURN
end;

Я вот тоже не понял, к кому обращен этот поток сознания. Не понял что написано - с чем споришь, а?
28 фев 18, 18:41    [21226066]     Ответить | Цитировать Сообщить модератору
 Re: Как sql компилирует и хранит план, если много if и как влияет return  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Компилятор просто скомпилирует как есть. А вот план будет построен для того флага, с которым будет первый вызов процедуры.

Собственно при компиляции будет неявный выход после попадания в любой удовлетворяющий if или цикл проверки закончится последним if?
1 мар 18, 00:14    [21226716]     Ответить | Цитировать Сообщить модератору
 Re: Как sql компилирует и хранит план, если много if и как влияет return  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Проще говоря, строит ли компилятор дерево вызовов опираясь на управляющие if и делает ли лишние итерации проверки или нет.
По сути в этом вопрос.
Не совсем это про план выполнения. Хотя касается его.
1 мар 18, 00:17    [21226722]     Ответить | Цитировать Сообщить модератору
 Re: Как sql компилирует и хранит план, если много if и как влияет return  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Что я имею в виду - компилятор мог бы выстроить как именно проходить по блокам и что делать после.

Вот было бы после всех if чтонибудь вроде return.
И в этом случае в дереве вызовов (инструкциях) могло бы быть следующее: вот в этот блок заходим, потом столько то блоков (if) пропускаем и вызываем вот этот, где return стоит.
1 мар 18, 00:19    [21226729]     Ответить | Цитировать Сообщить модератору
 Re: Как sql компилирует и хранит план, если много if и как влияет return  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36965
_Промешан_ ,

У вас праздный вопрос, или есть проблемы какие-то?
1 мар 18, 01:02    [21226778]     Ответить | Цитировать Сообщить модератору
 Re: Как sql компилирует и хранит план, если много if и как влияет return  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
_Промешан_
Что я имею в виду - компилятор мог бы выстроить как именно проходить по блокам и что делать после.

Вот было бы после всех if чтонибудь вроде return.
И в этом случае в дереве вызовов (инструкциях) могло бы быть следующее: вот в этот блок заходим, потом столько то блоков (if) пропускаем и вызываем вот этот, где return стоит.

это будет актуальный план
1 мар 18, 10:43    [21227429]     Ответить | Цитировать Сообщить модератору
 Re: Как sql компилирует и хранит план, если много if и как влияет return  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Гавриленко Сергей Алексеевич
_Промешан_ ,

У вас праздный вопрос, или есть проблемы какие-то?

Ну как праздный. Не совсем.
Нужно для себя понять в каких случаях и главное ПОЧЕМУ стоит или не стоит писать return. Почему например нельзя в каждом блоке if писать return?

if a=1
begin
...
return 0;
end

if a=2
begin
...
return 0;
end

if a=3
begin
...
return 0;
end

if a=4
begin
...
return 0;
end

Например так. Мы то обычно не пишем. Но тут возник некий вопрос а что случится нехорошего если писать ретурн всегда.
(а - не меняется внутри if).
12 мар 18, 17:49    [21250648]     Ответить | Цитировать Сообщить модератору
 Re: Как sql компилирует и хранит план, если много if и как влияет return  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7754
_Промешан_,

Увеличите затраты на сопровождение такого кода. Особенно если по требованиям очередного тимлида начнете заворачивать в транзакции. А что компилятору - он железный, справится.
12 мар 18, 18:33    [21250798]     Ответить | Цитировать Сообщить модератору
 Re: Как sql компилирует и хранит план, если много if и как влияет return  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Владислав Колосов
_Промешан_,

Увеличите затраты на сопровождение такого кода. Особенно если по требованиям очередного тимлида начнете заворачивать в транзакции. А что компилятору - он железный, справится.

+1
проще поддерживать, когда у хранимки одна точка выхода
12 мар 18, 18:41    [21250818]     Ответить | Цитировать Сообщить модератору
 Re: Как sql компилирует и хранит план, если много if и как влияет return  [new]
invm
Member

Откуда: Москва
Сообщений: 9345
_Промешан_
if a=1
begin
...
return 0;
end

if a=2
begin
...
return 0;
end

if a=3
begin
...
return 0;
end

if a=4
begin
...
return 0;
end
Обычно такие портянки гораздо проще и правильнее писать вот так:
create InternalProc0
as
...
go

create InternalProc1
as
...
go

...

create InternalProcN
as
...
go

create SomeProc
as
begin
 ...

 declare @result int, @proc = N'InternalProc' + cast(@SomeVariable as nvarchar(10));

 if object_id(@proc, 'P') is null
  begin
   raiserror ...
   return ...
  end;

 exec @result = @proc ...
 return @result;
end;
12 мар 18, 20:01    [21250960]     Ответить | Цитировать Сообщить модератору
 Re: Как sql компилирует и хранит план, если много if и как влияет return  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
declare @a int;

set @a=99999;

if       @a=1 begin ... end
 else if @a=2 begin ... end
 else if @a=3 begin ... end
 else         begin ... end;
13 мар 18, 14:53    [21252888]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить