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

Откуда: glubinka
Сообщений: 4256
CREATE FUNCTION dbo.fn_doc_usage_usersInGroup( @userID  VARCHAR(max) )
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
  SELECT slnxuser_id, slnxuser_name FROM
  (
    SELECT slnxuser_id, slnxuser_name, 0 AS code FROM dbo.fn_doc_usage_some_usersInGroup( @userID, @docType)
	UNION ALL
    SELECT slnxuser_id, slnxuser_name, 1 AS code FROM dbo.fn_doc_usage_all_usersInGroup( @docType )
  )a
	WHERE code = (CASE WHEN @userID IS NULL OR @userID = '' THEN 1 ELSE 0 END);
GO


select top 100 * from dbo.fn_doc_usage_some_usersInGroup('1,17,233', null ) -- 7 sec
select top 100 * from dbo.fn_doc_usage_all_usersInGroup(null) -- 0 sec

select top 100 * from dbo.fn_doc_usage_usersInGroup('1,17,233', null) -- 7 sec
select top 100 * from dbo.fn_doc_usage_usersInGroup(null) -- 1:28 !!!!

количество users 15,000.
Да, запустил каждую функцию по 3 раза.

что делать? куда бежать?
13 мар 15, 18:01    [17382380]     Ответить | Цитировать Сообщить модератору
 Re: почему заворачивание в фунцию снижает производительность?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Бежать к плану выполнения.
13 мар 15, 18:20    [17382468]     Ответить | Цитировать Сообщить модератору
 Re: почему заворачивание в фунцию снижает производительность?  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Понятно что планы будут разные, но почему?

По идее оптимизатор inline функции должен разворачивать
select top 100 * from dbo.fn_doc_usage_usersInGroup(null)

в
select top 100 * from dbo.fn_doc_usage_all_usersInGroup(null) 

без такой драматической деградации.
13 мар 15, 18:31    [17382512]     Ответить | Цитировать Сообщить модератору
 Re: почему заворачивание в фунцию снижает производительность?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Lepsik
По идее оптимизатор inline функции должен разворачивать
select top 100 * from dbo.fn_doc_usage_usersInGroup(null)


в
select top 100 * from dbo.fn_doc_usage_all_usersInGroup(null) 

А объединение с dbo.fn_doc_usage_some_usersInGroup оптимизатор должен игнарировать ?
top 100 из union-а двух запросов не есть тоже самое, что top 100 отдельно из каждого запроса
13 мар 15, 21:16    [17383013]     Ответить | Цитировать Сообщить модератору
 Re: почему заворачивание в фунцию снижает производительность?  [new]
DirksDR
Member

Откуда: Пермь
Сообщений: 340
Lepsik,

Есть подозрение, что у функции fn_doc_usage_usersInGroup должен быть второй параметр @docType, нет?
13 мар 15, 21:23    [17383038]     Ответить | Цитировать Сообщить модератору
 Re: почему заворачивание в фунцию снижает производительность?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
Вы бы не баловались с VARCHAR(max) без нужды.
13 мар 15, 22:24    [17383158]     Ответить | Цитировать Сообщить модератору
 Re: почему заворачивание в фунцию снижает производительность?  [new]
aleks2
Guest
Зачем напрягать сервер ерундой?

CREATE FUNCTION dbo.fn_doc_usage_usersInGroup( @userID  VARCHAR(max) )
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
    SELECT slnxuser_id, slnxuser_name, 0 AS code FROM dbo.fn_doc_usage_some_usersInGroup( @userID, @docType) WHERE @userID <> ''
	UNION ALL
    SELECT slnxuser_id, slnxuser_name, 1 AS code FROM dbo.fn_doc_usage_all_usersInGroup( @docType ) WHERE isnull(@userID, '') = ''
14 мар 15, 10:22    [17383735]     Ответить | Цитировать Сообщить модератору
 Re: почему заворачивание в фунцию снижает производительность?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Lepsik
select top 100 * from dbo.fn_doc_usage_usersInGroup('1,17,233', null) -- 7 sec
select top 100 * from dbo.fn_doc_usage_usersInGroup(null) -- 1:28 !!!!
Двух функций с одним и тем же именем быть не может.
14 мар 15, 12:00    [17383851]     Ответить | Цитировать Сообщить модератору
 Re: почему заворачивание в фунцию снижает производительность?  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
iap,

там десяток параметров, я отрезал лишнее
15 мар 15, 01:32    [17385200]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить