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

Откуда: Ильичевск (Одесса)
Сообщений: 277
к примеру такой запрос
select * from tbl where status=dbo.fStatus('B')

где fStatus - возвращает определенное статическое значение
в общем использую fStatus как список констант

вопрос: dbo.fStatus будет вычисляться для каждой строки или единоразово перед запросом?
другими словами имеет ли смысл при работе с большим объемом данных делать так?
declare @st int=dbo.fStatus('B')
select * from tbl where status=@st

--
проверить не получается, т.к. ни update ни print в ф-цию вставить нельзя, чтоб поставить там счетчик
7 янв 12, 02:36    [11866965]     Ответить | Цитировать Сообщить модератору
 Re: User Function - сколько раз выполняется в запросе  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
Можно запустить профайлер и ловить события SP:StmtCompleted.
А еще это от самой функции зависит и потенциально - от конкретного билда сервера.
Вообще лучше конечно в запросах функции не использовать.
7 янв 12, 02:55    [11866984]     Ответить | Цитировать Сообщить модератору
 Re: User Function - сколько раз выполняется в запросе  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
DNV
проверить не получается
План запроса всё чётко показывает.
DNV
будет вычисляться для каждой строки или единоразово перед запросом?
В данном случае скорее единоразово (префикс по индексу).
Но в общем случае влияет детерминированность функции. Определяемая независимостью от сторонних данных и использованию других функций (системных).

А ещё можно (и лучше) использовать inline функции (параметризованные представления). Скалярки стараться вообще не использовать, разве что для таких случаев можно.
7 янв 12, 02:59    [11866987]     Ответить | Цитировать Сообщить модератору
 Re: Данные о логине в HttpContext.Current.User.Identity.Name. Безопасно ли?  [new]
DNV
Member

Откуда: Ильичевск (Одесса)
Сообщений: 277
>План запроса всё чётко показывает.
ничего он не показывает в данной ситуации. проверял
ф-ция такая

ALTER function [dbo].[frStatus](@type char(1))
returns int
AS
Begin
	return case @type
		when 'B' then 1
		when 'D' then 2

		....
 
		else 0
		end
End


попробую поиграться с профайлером
7 янв 12, 03:46    [11867013]     Ответить | Цитировать Сообщить модератору
 Re: User Function - сколько раз выполняется в запросе  [new]
DNV
Member

Откуда: Ильичевск (Одесса)
Сообщений: 277
Mnior, спасибо!
прочитал про детерминированность, моя ф-ция удовлетворяет ее условиям :)
7 янв 12, 03:51    [11867018]     Ответить | Цитировать Сообщить модератору
 Re: User Function - сколько раз выполняется в запросе  [new]
DNV
Member

Откуда: Ильичевск (Одесса)
Сообщений: 277
профилирование SP:StmtCompleted показало, что все таки выполняется для каждой строки
7 янв 12, 04:00    [11867031]     Ответить | Цитировать Сообщить модератору
 Re: User Function - сколько раз выполняется в запросе  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
Получается, что в таком (примерно) случае:
select case when sum(number)<100 then sum(number) else -1 end from master..spt_values where type='P' and number between 1 and 10

агрегация будет выполняться дважды - sum ведь недетерминированная функция?
7 янв 12, 08:34    [11867197]     Ответить | Цитировать Сообщить модератору
 Re: User Function - сколько раз выполняется в запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
DNV
Mnior, спасибо!
прочитал про детерминированность, моя ф-ция удовлетворяет ее условиям :)
Читать надо внимательнее!
Выполните
PRINT OBJECTPROPERTY(OBJECT_ID(N'[dbo].[frStatus]','FN'),'IsDeterministic');
Что возвращает? 0? То-то!
А вот так получится детерминированная функция:
ALTER function [dbo].[frStatus](@type char(1))
returns int
WITH SCHEMABINDING
AS
Begin
	return case @type
		when 'B' then 1
		when 'D' then 2

		....
 
		else 0
		end
End
7 янв 12, 12:09    [11867320]     Ответить | Цитировать Сообщить модератору
 Re: User Function - сколько раз выполняется в запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Сон Веры Павловны
Получается, что в таком (примерно) случае:
select case when sum(number)<100 then sum(number) else -1 end from master..spt_values where type='P' and number between 1 and 10

агрегация будет выполняться дважды - sum ведь недетерминированная функция?
SUM() - это не UDF
7 янв 12, 12:10    [11867321]     Ответить | Цитировать Сообщить модератору
 Re: User Function - сколько раз выполняется в запросе  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
iap
SUM() - это не UDF

Разумеется, я в курсе этого. Тогда получается, что в случае системных функций их детерминированность/недетерминированность не влияет на их количество выполнений в запросе, а влияет только на детерминированность объектов, содержащих эти функции.
И по поводу WITH SCHEMABINDING, раз уж его упомянули. У нас в конторе есть некая софтина, у которой имеется достаточно большое количество скалярных функций без SCHEMABINDING. Мы в своих самописных функциях используем функции этой софтины, и я достаточно давно подумывал о том, чтобы проальтерить некоторые функции этой софтины с указанием WITH SCHEMABINDING - у этих функций для такой операции есть все предпосылки. Может ли это в будущем повлечь за собой какие-либо последствия? (не в юридическом плане )).
7 янв 12, 12:35    [11867348]     Ответить | Цитировать Сообщить модератору
 Re: User Function - сколько раз выполняется в запросе  [new]
aleks2
Guest
select * from tbl where status=(select dbo.fStatus('B'))

Раньше помогало даж с абсолютно недетерминированными...
7 янв 12, 16:19    [11867694]     Ответить | Цитировать Сообщить модератору
 Re: User Function - сколько раз выполняется в запросе  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
DNV
>План запроса всё чётко показывает.
ничего он не показывает в данной ситуации. проверял
Это почему же?
7 янв 12, 16:21    [11867696]     Ответить | Цитировать Сообщить модератору
 Re: User Function - сколько раз выполняется в запросе  [new]
DNV
Member

Откуда: Ильичевск (Одесса)
Сообщений: 277
Mnior
Это почему же?

потому что не внимательно смотрел , sorry

iap
WITH SCHEMABINDING

спасибо! действительно помогло
9 янв 12, 00:23    [11872148]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить