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

Откуда:
Сообщений: 38
1 млн записей
Функция:
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER   FUNCTION [dbo].[fArticle](@Article varchar (30))
RETURNS varchar (30) 
AS
BEGIN
 
return (upper(replace(replace(replace(replace(replace(replace(replace(@Article,' ',''),'.',''),'-',''),' ',''),'/',''),'`',''), '''', '')))
   
END

Запрос Выполняется 22 сек
select distinct  артикул  from ##price group by  артикул  having COUNT(dbo.farticle(артикул))>1  


Запрос Выполняется 1 сек
select distinct  артикул  from ##price group by  артикул  having COUNT(upper(replace(replace(replace(replace(replace(replace(replace(артикул,' ',''),'.',''),'-',''),' ',''),'/',''),'`',''), '''', '')))>1  


Как сделать чтобы функция работала так же быстро?
12 окт 16, 19:02    [19775126]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией! Слишком долго работает простая функция.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
fumitox,

табличную инлайн-функцию написать:

CREATE FUNCTION [dbo].[fArticle](@Article varchar (30))
RETURNS TABLE
AS
return (select upper(replace(replace(replace(replace(replace(replace(replace(@Article,' ',''),'.',''),'-',''),' ',''),'/',''),'`',''), '''', '')) Article)
go
select a.Article  from ##price
  cross apply dbo.fArticle(##price.артикул) a


скалярки, применительно к наборам, особенно большим - это медленно.
12 окт 16, 19:09    [19775153]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией! Слишком долго работает простая функция.  [new]
fumitox
Member

Откуда:
Сообщений: 38
daw, Теперь буду знать что это нормально) Спасибо!
12 окт 16, 19:33    [19775216]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией! Слишком долго работает простая функция.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8570
fumitox,

а теперь попробуйте

select distinct  артикул  from ##price group by  артикул  having COUNT(upper(replace(replace(replace(replace(replace(replace(replace(артикул,' ',''),'.',''),'-',''),' ',''),'/',''),'`',''), '''', '')))>1
OPTION(MAXDOP 1)
12 окт 16, 21:58    [19775616]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией! Слишком долго работает простая функция.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Владислав Колосов,

А как это должно было помочь?
13 окт 16, 00:44    [19776056]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией! Слишком долго работает простая функция.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8570
Mike_za,

может помочь в понимании сути проблемы.
13 окт 16, 08:47    [19776341]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией! Слишком долго работает простая функция.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31863
Владислав Колосов
Mike_za,

может помочь в понимании сути проблемы.
Суть проблемы не в отсутствии/присутствии распараллеливания, а в безобразной реализации вызовов скалярных функций в движке MSSQL. Сам вызов зачем то потребляет миллионы команд процессора.
13 окт 16, 09:57    [19776625]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить