Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Долгая или неуспешная компиляция inline UDF в SQL 2019 / 8 сообщений из 8, страница 1 из 1
23.01.2020, 22:07
    #39918115
Acce_Ekb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгая или неуспешная компиляция inline UDF в SQL 2019
Добрый день,

Когда-то похожая проблема была при переходе на SQL 2014: запросы с большим количеством join уходили в долгую компиляцию (есть ссылка на connect, которая теперь бесполезна).

Сейчас на SQL 2019 простые UDF стали автоматически inline.
Рассмотрим пример.

Версия
Код: plaintext
1.
2.
3.
Microsoft SQL Server 2019 (RTM-CU1) (KB4527376) - 15.0.4003.23 (X64) 
	Dec  6 2019 14:53:33 
	Copyright (C) 2019 Microsoft Corporation
	Developer Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor)

Функция (код упрощен, в оригинале похожая логика - несколько if и присваивание переменной):
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
set statistics time off
go

if object_id('dbo.TestUDF') is not null
  drop function dbo.TestUDF
go

create function dbo.TestUDF()
returns int
as
begin
  declare @i int

  set @i = 1
  if ( @i = 1 )  set @i = 2
  if ( @i = 2 )  set @i = 3
  if ( @i = 3 )  set @i = 4
  if ( @i = 4 )  set @i = 5
  if ( @i = 5 )  set @i = 6
  if ( @i = 6 )  set @i = 7
  if ( @i = 7 )  set @i = 8
  if ( @i = 8 )  set @i = 9
  if ( @i = 9 )  set @i = 10
  if ( @i = 10 ) set @i = 11
  if ( @i = 11 ) set @i = 12
  if ( @i = 12 ) set @i = 13
  if ( @i = 13 ) set @i = 14
  if ( @i = 14 ) set @i = 15  
  if ( @i = 15 ) set @i = 16
  if ( @i = 16 ) set @i = 17
  if ( @i = 17 ) set @i = 18
  if ( @i = 18 ) set @i = 19

  -- if ( @i = 19 ) set @i = 20
  
  return( @i )
end
go

set statistics time on
go

select dbo.TestUDF()



Результат 1
Код: plaintext
1.
SQL Server parse and compile time: 
   CPU time = 4640 ms, elapsed time = 4708 ms.

Если в коде функции раскомментировать строку, то после долгого времени ожидания (зависит от оборудования) -

Результат 2
Код: plaintext
1.
Msg 701, Level 17, State 123, Line 45
There is insufficient system memory in resource pool 'default' to run this query.
и многочисленные сообщения в журнале сервера про выделение памяти.

Отключим inline
Код: sql
1.
ALTER DATABASE SCOPED CONFIGURATION SET TSQL_SCALAR_UDF_INLINING = OFF



Результат 3
Код: plaintext
1.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

Если добавить в код каких-нибудь select, то результат проявляется на более коротком коде (не 20 if-ов, а примерно 10).
Похоже на ошибку.
...
Рейтинг: 0 / 0
24.01.2020, 02:18
    #39918147
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгая или неуспешная компиляция inline UDF в SQL 2019
Acce_EkbКогда-то похожая проблема была при переходе на SQL 2014: запросы с большим количеством join уходили в долгую компиляцию (есть ссылка на connect, которая теперь бесполезна).
Сейчас на SQL 2019 простые UDF стали автоматически inline.Ага. Когда-то давно у человечества была проблема с чумой, сейчас - с загрязнением воздуха, парниковым эффектом и что-то там про пластик заливают.
Acce_EkbРассмотрим пример...код упрощенКод так себе. Но если у вас такие скалярки, то сделайте "Отключим inline", и живите спокойно.
Acce_EkbПохоже на ошибку.Ну, в support.microsoft.com пишите. Сюда аппелировать зачем?
...
Рейтинг: 0 / 0
24.01.2020, 08:16
    #39918177
Acce_Ekb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгая или неуспешная компиляция inline UDF в SQL 2019
Гавриленко Сергей Алексеевич
Сюда аппелировать зачем?

Потому что это интересно и, возможно, полезно для других.
...
Рейтинг: 0 / 0
24.01.2020, 08:38
    #39918181
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгая или неуспешная компиляция inline UDF в SQL 2019
Acce_Ekb
Гавриленко Сергей Алексеевич
Сюда аппелировать зачем?

Потому что это интересно и, возможно, полезно для других.
Действительно же, важная информация о SQL 2019, я, например, этого не знал.
Гавриленко Сергей Алексеевич
Код так себе.
Как я понимаю, баг относится к любой скалярной инлайн-функции, у которой есть некоторое количество if
Конечно, в нормальной системе не используют скалярные функции, т.к. раньше инлайн не было.
Но если они всё таки есть, то IF-ы в них обычно встречаются, и тогда нужно учитывать этот баг при переходе на 2019.
...
Рейтинг: 0 / 0
24.01.2020, 10:20
    #39918230
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгая или неуспешная компиляция inline UDF в SQL 2019
В общем-то понятно что все udf не взлетят в inline. Или вообще отключать или WITH INLINE = OFF
под рукой 2019 нет, но имхо если делать if .. else if то может и взлетит
...
Рейтинг: 0 / 0
24.01.2020, 10:37
    #39918238
Acce_Ekb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгая или неуспешная компиляция inline UDF в SQL 2019
TaPaK
В общем-то понятно что все udf не взлетят в inline. Или вообще отключать или WITH INLINE = OFF
под рукой 2019 нет, но имхо если делать if .. else if то может и взлетит

Отключили, да.
Отмечу - в нашем конкретном примере скалярная функция вычисляет некий показатель в несколько шагов, используется не в запросе
Код: sql
1.
select dbo.MyFunc(), ... from MyTable


а просто вызывается для получения одного скалярного значения
Код: sql
1.
select @Result = dbo.MyFunc()


ей inline и не нужен.
...
Рейтинг: 0 / 0
24.01.2020, 10:48
    #39918244
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгая или неуспешная компиляция inline UDF в SQL 2019
Acce_Ekb,

ну они пошли по пути, что если подходит то пусть будет инлайн, хотя логичнее было бы регулировать только WITH INLINE = ON/OFF
...
Рейтинг: 0 / 0
25.01.2020, 13:46
    #39918652
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгая или неуспешная компиляция inline UDF в SQL 2019
Acce_Ekb,

это "проба пера", чему здесь удивляться. У них не собралось статистики баг-репортов, через год-полтора можно будет пользоваться.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Долгая или неуспешная компиляция inline UDF в SQL 2019 / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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