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

Откуда:
Сообщений: 354
Есть запрос
select id, dbo.func(id) from tbl where dbo.func(id)>0
Функция вычисляется А+Б раз, где А - кол-во строк в таблице, Б - кол-во строк, функция от которых больше нуля. Функция довольно сложная, поэтому время на вызов А+Б раз существенно больше, чем на А раз.
Единственный выход, который я знаю: использование временной таблицы. Может я чего упустил из виду?
11 апр 05, 16:23    [1457990]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать множественный вызов скалярной UDF  [new]
Stupindo
Member

Откуда:
Сообщений: 143
А если так?

select *
from (
select id, dbo.func(id) as f 
from tbl)
where f > 0
11 апр 05, 16:29    [1458023]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать множественный вызов скалярной UDF  [new]
Glory
Member

Откуда:
Сообщений: 104760
Единственный выход, который я знаю: использование временной таблицы. Может я чего упустил из виду?
Вычисляемый столбец и индекс на его основе.

ЗЫ
Или пересматривать постановку задачи. Хотя она скорее всего идет от схемы данных
11 апр 05, 16:32    [1458040]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать множественный вызов скалярной UDF  [new]
Alois
Member

Откуда:
Сообщений: 354
2 Stupindo
План выполнения не меняется.

2 Glory
Функция func внутри собирает информацию из 2-х таблиц.
База развивается спонтанно. Каждый день/неделю/месяц у руководства всплывают новые идеи того, что и как учитывать. Нормальной схемы нет вообще. Нормального хозяина схемы тоже.
11 апр 05, 17:05    [1458214]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать множественный вызов скалярной UDF  [new]
tygra
Member

Откуда: Тверь (Иркутск, Край)
Сообщений: 9997
автор
Функция func внутри собирает информацию из 2-х таблиц

Ну может стоит это вынести из функции наружу.

Что она делает с таблицами?

-- Tygra's --
11 апр 05, 17:55    [1458429]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать множественный вызов скалярной UDF  [new]
tygra
Member

Откуда: Тверь (Иркутск, Край)
Сообщений: 9997
автор
2 Stupindo
План выполнения не меняется.

А должен.
Да и функция выполнится меньшее количество раз.

-- Tygra's --
11 апр 05, 17:56    [1458435]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать множественный вызов скалярной UDF  [new]
aleks2
Guest
1) Добавляем поле _func в таблицу

2)

UPDATE tbl SET _func=dbo.func(id)

select id, _func from tbl where _func(id)>0
12 апр 05, 06:29    [1459166]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать множественный вызов скалярной UDF  [new]
aleks2
Guest
Впрочем, так будет быстрее

declare @t table(id int, func ???, UNIQUE(id))

insert @t select id, dbo.func(id) FROM tbl

select T.id, func from tbl T inner join @t X on T.ID=X.id where func>0

-- ежели на самом деле надо только id и func
select id, func from  @t where func>0
12 апр 05, 06:34    [1459168]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать множественный вызов скалярной UDF  [new]
Alois
Member

Откуда:
Сообщений: 354
tygra
[quot автор]2 Stupindo
План выполнения не меняется.

А должен.
Да и функция выполнится меньшее количество раз.
/quot]
Да я и сам так думал, пока не попробовал. Например, в таблице всего 4 строки. 2 строки попадает в условие WHERE. Так вот функция выполняется аккурат 6 раз. Я даже внутренний запрос в вид пихал. Без разницы. Кстати, пока не поставил алиас внутреннему запросу, сервер давал "ошибку возле where".
Функция осуществляет выборку из соединения 2-х таблиц и далее курсором выполняет анализ каждой строки результата. Хорошо хоть строк в этом результате всегда меньше 20 (пока).
Мне и самому чего-то всё это не по душе. Как-то должно это всё красивее выглядеть.
12 апр 05, 09:47    [1459531]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать множественный вызов скалярной UDF  [new]
Alois
Member

Откуда:
Сообщений: 354
2 Aleks
Это и есть использование временной таблицы в разных вариантах.
12 апр 05, 09:49    [1459546]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать множественный вызов скалярной UDF  [new]
Alois
Member

Откуда:
Сообщений: 354
Я может немного ввел вас в заблуждение. В плане нет внутренних вызовов функции. Я смотрел кол-во вызовов, установив в QA в меню "Query" кнопку "Show server trace".
12 апр 05, 09:56    [1459597]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить