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

Откуда:
Сообщений: 457
Создаю табличную функцию с параметрами в sql2012
в начале идет описание структуры возвращаемой таблицы
далее создаю временную таблице
добавляю в нее записи запросом
редактирую эти записи запросом
добавляю в финальную таблицу записи из временной запросом с добавлением данных по полям из других таблиц

в отдельном соединении выполняю запрос из этой функции с параметрами (выполняется долго)

в отдельном окне копирую скрипт этой функции без описания финальной таблицы
вызываю просто селект, с помощью которого заполняется финальная таблица в функции (выполняется мгновенно)

пробовал написать в функции так

DECLARE @TZ TABLE ...
...
INSERT INTO @TZ ...
UPDATE @TZ SET ...
...
RETURNS TABLE
AS
RETURN (...)

не пропускает

а в штатном синтаксисе так

AS
RETURNS @tReport TABLE (...)
....
....
INSERT INTO @tReport ....
...
RETURN

Как можно извратиться без финальной таблицы в функции, но при этом оперировать в временными таблицами?
Или такой возможности нет?
22 ноя 13, 11:07    [15172630]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
aleks2
Guest
Хто понял (способен отфильтровать) этот мутный поток сознания?
22 ноя 13, 11:09    [15172648]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
Draginsv
Member

Откуда:
Сообщений: 457
Что не понятно объяснил?
22 ноя 13, 11:13    [15172661]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
free_walker
Member

Откуда: Эта страна
Сообщений: 823
Что Вы пытаетесь сделать вот этим:


RETURNS TABLE
AS
RETURN (...)


??
22 ноя 13, 11:16    [15172679]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
aleks2
Guest
Draginsv
Что не понятно объяснил?

Ты нипаверишь - ваще ничего. Сходи на курсы "внятного объяснения" чтоле?

Т.е. я, канешно, могу пованговать и сообразить, что ты испытываешь иллюзию, что эти две декларации

DECLARE @TZ TABLE ...
и
AS
RETURNS @tReport TABLE (...)

различаются.
Я тя огорчу - оне одинаковые таблицы создают.
22 ноя 13, 11:21    [15172713]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
Draginsv
Member

Откуда:
Сообщений: 457
Проблема следующая
я не могу возврат табличной функции описать одним запросом без манипуляций с временными таблицами

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

просто вызов тупого селекта из временной таблицы с жоинами - мгновенно

как можно описать табличную функцию с временными таблицами и манипуляциями с ними но без финальной таблицы?
22 ноя 13, 11:22    [15172720]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
aleks2
Guest
Чукча не читатель.
22 ноя 13, 11:24    [15172742]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
Draginsv
Member

Откуда:
Сообщений: 457
грубо говоря так

ALTER FUNCTION fff ()
(
@io int,
@d1 datetime
)
RETURNS TABLE
AS RETURN (select * from @TZ inner join ... )

куда здесь можно вставить?
DECLARE @TZ TABLE ...
...
INSERT INTO @TZ ...
UPDATE @TZ SET ...
...
22 ноя 13, 11:28    [15172781]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
invm
Member

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

Вы зациклились на вставке в табличную переменную, хотя причина "тормозов" может быть совсем не в этом.
Хотите помощи - показывайте текст вашей функции полностью.
22 ноя 13, 11:33    [15172829]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
Draginsv
Member

Откуда:
Сообщений: 457
вот так

AS
RETURNS @tReport TABLE (...)
....
DECLARE @TZ TABLE ...
...
INSERT INTO @TZ ...
UPDATE @TZ SET ...
...
....
INSERT INTO @tReport (...)
select * from @TZ inner join ...
...

RETURN

очень медленно (6 минут)
22 ноя 13, 11:34    [15172831]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
aleks2
Guest
Draginsv
грубо говоря так

ALTER FUNCTION fff ()
(
@io int,
@d1 datetime
)
RETURNS TABLE
AS RETURN (select * from @TZ inner join ... )

куда здесь можно вставить?
DECLARE @TZ TABLE ...
...
INSERT INTO @TZ ...
UPDATE @TZ SET ...
...


Еще раз для непонятливых чукчей: НИЗЗЯ.
22 ноя 13, 11:35    [15172844]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
Draginsv
Member

Откуда:
Сообщений: 457
в отдельном окне студио
это выполняется мгновенно

DECLARE
@io int,
@d1 datetime

DECLARE @TZ TABLE ...
...
INSERT INTO @TZ ...
UPDATE @TZ SET ...
...

select * from @TZ inner join ...

вывод :

INSERT INTO @tReport (...)
select * from @TZ inner join ...

замедляет процесс получения данных
22 ноя 13, 11:37    [15172863]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Draginsv,

а зачем вообще вам этот промежуточный набор @TZ, может стоит попробовать вместо многострочной функции написать инлайн?
22 ноя 13, 11:41    [15172900]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
Jaffar
Member

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

1.вам нужно посмотреть план выполнения запроса тогда будет видно где затык.
2.Попробуйте выполнить в отдельном окне все тело функции, включая вставку в финальную таблицу.

3.Если план выполнения для вас китайская грамота - попробуйте поиграть с option(force order, recompile и т.п.).
22 ноя 13, 11:49    [15172963]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
Draginsv
Member

Откуда:
Сообщений: 457
не получается инлайн
от параметра @IO зависит что вливать в @TZ
и апдейтить приходится.
Да можно конечно все привести к селекту, тогда это все обрастет снежным комом.

но почему зараза тормозит?
дисковые операции с tempdb протекают медленно на сервере ?
не знаю.

Итог
значит вставку в инлайне сделать нельзя, только цельной селект.
или мультилайн.

Спасибо всем!
22 ноя 13, 11:50    [15172969]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Draginsv
не получается инлайн
от параметра @IO зависит что вливать в @TZ
и апдейтить приходится.
Да можно конечно все привести к селекту, тогда это все обрастет снежным комом.

можно в том же единственном запросе сделать выборку, зависящую от @IO и оформить это как cte для наглядности
апдейт заменить на вычисление
все-таки, стоит попробовать инлайн
22 ноя 13, 11:56    [15173008]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
Draginsv
Member

Откуда:
Сообщений: 457
Jaffar
Shakill,

1.вам нужно посмотреть план выполнения запроса тогда будет видно где затык.
2.Попробуйте выполнить в отдельном окне все тело функции, включая вставку в финальную таблицу.

3.Если план выполнения для вас китайская грамота - попробуйте поиграть с option(force order, recompile и т.п.).


сам запрос - мгновено
22 ноя 13, 12:11    [15173099]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
Draginsv
Member

Откуда:
Сообщений: 457
Вообще этот вопрос не случайный, какой то затык.

скрипт по созданию, заполнению временной таблицы, а потом селекта из нее происходит мгновенно.
как только это засунуть в мультилайн фунцию а из функции сделать селект - все висит.
дурдом какой то.
22 ноя 13, 13:53    [15174015]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
Draginsv
Member

Откуда:
Сообщений: 457
Вопрос с функцией закрыт. разобрался. дырка в эксперименте с запросом. индекс добавил и функция заработала. Извиняюсь.
22 ноя 13, 14:44    [15174555]     Ответить | Цитировать Сообщить модератору
 Re: Как быть с табличной функцией?  [new]
aleks2
Guest
Shakill
можно в том же единственном запросе сделать выборку, зависящую от @IO и оформить это как cte для наглядности
апдейт заменить на вычисление
все-таки, стоит попробовать инлайн


Хе-хе?! Это абсолютно бесполезно, для существа, верующего в чудеса и с отсутствующим мозгом.
23 ноя 13, 05:59    [15178197]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить