Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Conditional usage of inline SQL functions  [new]
McCar
Member

Откуда: Саратов
Сообщений: 772
Всем привет.
Ситуация.
Есть некая inline table-valued function, которая входит в запрос в хранимую процедуру.
Функция использует xml преобразование, и ее использование, судя по execution plan, ощутимо влияет на общий performance.
Но при этом ее использование имеет смысл только при определеных значенях параметра хранимой процедуры.
Но, даже если я в явном виде прописываю вызов этой функции с дополнительным условием, она, судя по execution plan, все равно выполняется, независимо от этого условия.
В упрощенном виде этот факт выглядит так - см скрин в атачменте.
То есть WHERE условие накладываетя уже как бы после выполнения функции.
Причем если поставить условие WHERE 1=0 - тогда заход в функцию не происходит.
Есть способы обойти такое поведение, кроме Dynamic SQL?
Спасибо.

К сообщению приложен файл. Размер - 64Kb
14 май 19, 10:53    [21884138]     Ответить | Цитировать Сообщить модератору
 Re: Conditional usage of inline SQL functions  [new]
iap
Member

Откуда: Москва
Сообщений: 46689
Условие 0=1 заведомо даёт один и тот же результат всегда,
а значение переменной @Find_What заранее неизвестно и
она равна некоторому значению по умолчанию в момент компиляции (если ничего не делать, то NULL).
Видимо, именно для этого значения оптимизатор и подбирает оптимальный план.
14 май 19, 11:00    [21884151]     Ответить | Цитировать Сообщить модератору
 Re: Conditional usage of inline SQL functions  [new]
McCar
Member

Откуда: Саратов
Сообщений: 772
iap,
Это все понятно, но в run-time он в эту функцию реально заходит, и только после этого оценивает условие.
Можно этот порядок как то поменять?
14 май 19, 11:05    [21884163]     Ответить | Цитировать Сообщить модератору
 Re: Conditional usage of inline SQL functions  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6221
McCar,

IF @var IS NOT NULL
SELECT ..
14 май 19, 11:05    [21884164]     Ответить | Цитировать Сообщить модератору
 Re: Conditional usage of inline SQL functions  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1009
McCar,

используйте опцию
option (recompile)
14 май 19, 11:06    [21884165]     Ответить | Цитировать Сообщить модератору
 Re: Conditional usage of inline SQL functions  [new]
invm
Member

Откуда: Москва
Сообщений: 8554
McCar
Это все понятно, но в run-time он в эту функцию реально заходит, и только после этого оценивает условие.
Вы этот вывод сделали из формы плана?
14 май 19, 11:14    [21884177]     Ответить | Цитировать Сообщить модератору
 Re: Conditional usage of inline SQL functions  [new]
McCar
Member

Откуда: Саратов
Сообщений: 772
invm
McCar
Это все понятно, но в run-time он в эту функцию реально заходит, и только после этого оценивает условие.
Вы этот вывод сделали из формы плана?

Похоже вывод был неправильный.
Реальное значение "Number of Executions" там ноль.
Заказчик тут панику поднял что 100% стоимости запроса занимает вызов этой функции.
Спасибо
14 май 19, 11:37    [21884204]     Ответить | Цитировать Сообщить модератору
 Re: Conditional usage of inline SQL functions  [new]
McCar
Member

Откуда: Саратов
Сообщений: 772
felix_ff
McCar,

используйте опцию
option (recompile)

Спасибо, работает.
14 май 19, 12:14    [21884258]     Ответить | Цитировать Сообщить модератору
 Re: Conditional usage of inline SQL functions  [new]
-- KAB --
Member

Откуда: Москва
Сообщений: 4
McCar,

у вас parameter sniffing...

из решений

1 - option(recompile)
select Str_Out from ...
where @find_what is not null
option(recompile)

2. значений тут 2 можно и простым условием сделать...
if @find_what is not null
select Str_Out from ...
where @find_what is not null
else
select Str_Out from ...
--where @find_what is not null
16 май 19, 18:00    [21886544]     Ответить | Цитировать Сообщить модератору
 Re: Conditional usage of inline SQL functions  [new]
invm
Member

Откуда: Москва
Сообщений: 8554
-- KAB --
у вас parameter sniffing...
Нет там такого. Посмотрите внимательнее на предикат в where.
С этим запросом вообще озвученной проблемы нет, потому что в одном из фильтров на внешнем входе первого NL срабатывает Startup Expression Predicate по @Find_What is not null.
Что ТС и подтвердил - 21884204.
16 май 19, 20:39    [21886629]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить