powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как sql компилирует и хранит план, если много if и как влияет return
15 сообщений из 15, страница 1 из 1
Как sql компилирует и хранит план, если много if и как влияет return
    #39608654
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В процедуре несколько if, но без else.
Идут подряд.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
if @flag = 1
begin

end;

if @flag = 2
begin

end;

if @flag = 3
begin

end;


Как в этом случае ведет себя компилятор: а) если указывать в каждом блоке return б) если не указывать.
...
Рейтинг: 0 / 0
Как sql компилирует и хранит план, если много if и как влияет return
    #39608666
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_,

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

посмотреть вам было быстрее чем писать...
...
Рейтинг: 0 / 0
Как sql компилирует и хранит план, если много if и как влияет return
    #39608684
_Промешан_,

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

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

Если где-то что-то указывать, то скомпилируется с указанием указанного. Если не указывать что-то - оно не попадет в скомпилированный результат, потому как не существует. В поисках мистической оптимизации можно подумать на предмет, под какой же @flag компилятор сделает план. Во время компиляции переменная какое значение имеет? А во время выполнения?
...
Рейтинг: 0 / 0
Как sql компилирует и хранит план, если много if и как влияет return
    #39608685
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если указывать в каждом,

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


Код: sql
1.
2.
3.
4.
5.
if 1 = 3
begin
	SELECT top 1 * FROM master..spt_values
	RETURN
end;
...
Рейтинг: 0 / 0
Как sql компилирует и хранит план, если много if и как влияет return
    #39608686
TaPaKесли указывать в каждом,

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


Код: sql
1.
2.
3.
4.
5.
if 1 = 3
begin
	SELECT top 1 * FROM master..spt_values
	RETURN
end;


Я вот тоже не понял, к кому обращен этот поток сознания. Не понял что написано - с чем споришь, а?
...
Рейтинг: 0 / 0
Как sql компилирует и хранит план, если много if и как влияет return
    #39608769
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Компилятор просто скомпилирует как есть. А вот план будет построен для того флага, с которым будет первый вызов процедуры.

Собственно при компиляции будет неявный выход после попадания в любой удовлетворяющий if или цикл проверки закончится последним if?
...
Рейтинг: 0 / 0
Как sql компилирует и хранит план, если много if и как влияет return
    #39608770
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проще говоря, строит ли компилятор дерево вызовов опираясь на управляющие if и делает ли лишние итерации проверки или нет.
По сути в этом вопрос.
Не совсем это про план выполнения. Хотя касается его.
...
Рейтинг: 0 / 0
Как sql компилирует и хранит план, если много if и как влияет return
    #39608772
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что я имею в виду - компилятор мог бы выстроить как именно проходить по блокам и что делать после.

Вот было бы после всех if чтонибудь вроде return.
И в этом случае в дереве вызовов (инструкциях) могло бы быть следующее: вот в этот блок заходим, потом столько то блоков (if) пропускаем и вызываем вот этот, где return стоит.
...
Рейтинг: 0 / 0
Как sql компилирует и хранит план, если много if и как влияет return
    #39608781
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_ ,

У вас праздный вопрос, или есть проблемы какие-то?
...
Рейтинг: 0 / 0
Как sql компилирует и хранит план, если много if и как влияет return
    #39608883
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_Что я имею в виду - компилятор мог бы выстроить как именно проходить по блокам и что делать после.

Вот было бы после всех if чтонибудь вроде return.
И в этом случае в дереве вызовов (инструкциях) могло бы быть следующее: вот в этот блок заходим, потом столько то блоков (if) пропускаем и вызываем вот этот, где return стоит.
это будет актуальный план
...
Рейтинг: 0 / 0
Как sql компилирует и хранит план, если много if и как влияет return
    #39613685
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич_Промешан_ ,

У вас праздный вопрос, или есть проблемы какие-то?
Ну как праздный. Не совсем.
Нужно для себя понять в каких случаях и главное ПОЧЕМУ стоит или не стоит писать 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).
...
Рейтинг: 0 / 0
Как sql компилирует и хранит план, если много if и как влияет return
    #39613716
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_,

Увеличите затраты на сопровождение такого кода. Особенно если по требованиям очередного тимлида начнете заворачивать в транзакции. А что компилятору - он железный, справится.
...
Рейтинг: 0 / 0
Как sql компилирует и хранит план, если много if и как влияет return
    #39613723
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов_Промешан_,

Увеличите затраты на сопровождение такого кода. Особенно если по требованиям очередного тимлида начнете заворачивать в транзакции. А что компилятору - он железный, справится.
+1
проще поддерживать, когда у хранимки одна точка выхода
...
Рейтинг: 0 / 0
Как sql компилирует и хранит план, если много if и как влияет return
    #39613753
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_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Обычно такие портянки гораздо проще и правильнее писать вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
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;
...
Рейтинг: 0 / 0
Как sql компилирует и хранит план, если много if и как влияет return
    #39614156
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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;
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как sql компилирует и хранит план, если много if и как влияет return
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]