Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как sql компилирует и хранит план, если много if и как влияет return / 15 сообщений из 15, страница 1 из 1
28.02.2018, 17:58
    #39608654
_Промешан_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как sql компилирует и хранит план, если много if и как влияет return
В процедуре несколько 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
28.02.2018, 18:05
    #39608666
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как sql компилирует и хранит план, если много if и как влияет return
_Промешан_,

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

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

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

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

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

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


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

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


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


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

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

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

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

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

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

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

Увеличите затраты на сопровождение такого кода. Особенно если по требованиям очередного тимлида начнете заворачивать в транзакции. А что компилятору - он железный, справится.
+1
проще поддерживать, когда у хранимки одна точка выхода
...
Рейтинг: 0 / 0
12.03.2018, 20:01
    #39613753
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как sql компилирует и хранит план, если много 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Обычно такие портянки гораздо проще и правильнее писать вот так:
Код: 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
13.03.2018, 14:53
    #39614156
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как sql компилирует и хранит план, если много if и как влияет return
Код: 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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как sql компилирует и хранит план, если много if и как влияет return / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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