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

Откуда: Новосибирск
Сообщений: 13632
Чтобы перекомпиллять вид - sp_refreshview
А для перекомпилляции inline-функции?
30 май 03, 14:07    [216635]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпилляция inline-функций  [new]
RT#
Guest
Навскидку: sp_refreshinlinefunction
30 май 03, 14:18    [216658]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпилляция inline-функций  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
Можно поточнее, чего-то я такого найти не могу... (уже скоро неделя как ищу)...
2 июн 03, 11:21    [217998]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпилляция inline-функций  [new]
sparrow
Member

Откуда: Россия, Красноярск.
Сообщений: 21759
примерно так:
-- Пометка функций для перекомпиляции при очередоном запуске


DECLARE @object_name VARCHAR(255),
@query NVARCHAR(255)
DECLARE Run CURSOR STATIC FOR
SELECT name FROM sysobjects WHERE Type IN ('FN') -- (P,T,V - процедуры, тригеры, view)

OPEN Run
FETCH NEXT FROM Run INTO @object_name
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_recompile @object_name
FETCH NEXT FROM Run INTO @object_name
END
CLOSE Run
DEALLOCATE Run
2 июн 03, 12:28    [218130]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпилляция inline-функций  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
2 sparrow

Если мне не изменяет склероз, то sp_recompile предназначена для хп и триггеров. Причем она тока помечает их, как кандидатов на перекомпиляцию при следующем запуске.

2 Алексей К

А для перекомпилляции inline-функции?

А где ты прочитал, что на функцию создается отдельный план выполнения, чтоб его можно было потом перекомпелировать? План выполнения будет строиться на запрос, в котором используется функция.
2 июн 03, 13:01    [218170]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпилляция inline-функций  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
Да, для перекомпиляции видов такую штуку мы написали, только использовали sp_refreshview.

В БОЛе написано, что sp_recompile заточен под хранимые процедуры и триггеры. Применяю его для инлайн-функции, пишет что пометил её для перекомпиляции, но при её следующем запуске этого не происходит :-(

В БОЛе кроме этих процедур больше ничего относящегося к перекомпиляции я не нашёл (может плохо искал). Помогает только ALTER FUNCTION соответствующей функции. После этого всё начинает работать. Но это крайне неудобно. Очень хотелось бы написать такой же курсор для инлайн-функций.

HELP!!! HELP!!! HELP!!! HELP!!!
2 июн 03, 13:02    [218173]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпилляция inline-функций  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
2 pkarklin

Как я понял, именно с инлайн-функцией так и происходит. Чем тогда объяснить следующее?

Имеем:

CREATE function JYCalcTemp(@CopyCount int) returns table as return
select *,
dbo.JYPersTripNightsCount( @CopyCount, PersRD, TripMash, TripRD, TripID ) MashNights,
dbo.JYPersTripNightsCount( @CopyCount, PersRD, TripPom, TripRD, TripID ) PomNights,
dbo.JYTripWorkTime(@CopyCount, TripRD, TripID, RabCorrect) TripWorkTime,
dbo.JYNormHomeRestBefore(@CopyCount, TripYavOsn, PersRD, TripMash) MashBeforeRestHomeNorm,
dbo.JYNormHomeRestBefore(@CopyCount, TripYavOsn, PersRD, TripPom) PomBeforeRestHomeNorm,
dbo.JYNormHomeRest(@CopyCount, TripRD, TripID) RestHomeNorm,
dbo.JYHomeRestBefore(@CopyCount, TripYavOsn, PersRD, TripMash) MashRestHome,
dbo.JYHomeRestBefore(@CopyCount, TripYavOsn, PersRD, TripPom) PomRestHome,
dbo.JYPersMonthWorkTime(@CopyCount, TripSdOsn, PersRD, TripMash, ToNextMonth, Isp) MashRab,
dbo.JYPersMonthWorkTime(@CopyCount, TripSdOsn, PersRD, TripPom, ToNextMonth, Isp) PomRab,
dbo.JYPersMonthPrazdnTime(@CopyCount, TripSdOsn, PersRD, TripMash, ToNextMonth, Isp) MashPrazdn,
dbo.JYPersMonthPrazdnTime(@CopyCount, TripSdOsn, PersRD, TripPom, ToNextMonth, Isp) PomPrazdn,
dbo.JYPersWeekends( @CopyCount, TripSdOsn, PersRD, TripMash ) MashWeekends,
dbo.JYPersWeekends( @CopyCount, TripSdOsn, PersRD, TripPom ) PomWeekends
from JYCalc


CREATE function JYCalcWeekendEdgeTemp(@CopyCount int) returns table as return
select *,
dbo.JYWeekendLowEdge( PersRD, TripYavOsn, MashRestHome, MashBeforeRestHomeNorm ) MashWeekendLowEdge,
dbo.JYWeekendHighEdge( PersRD, TripYavOsn, MashRestHome, MashBeforeRestHomeNorm ) MashWeekendHighEdge,
dbo.JYWeekendLowEdge( PersRD, TripYavOsn, PomRestHome, PomBeforeRestHomeNorm ) PomWeekendLowEdge,
dbo.JYWeekendHighEdge( PersRD, TripYavOsn, PomRestHome, PomBeforeRestHomeNorm ) PomWeekendHighEdge,
dbo.JYWeekendHighEdge( PersRD, TripYavOsn, 0.0, RestHomeNorm ) CurrentWeekendHighEdge,
dbo.JYWeekendLowEdge( PersRD, TripYavOsn, 0.0, RestHomeNorm ) CurrentWeekendLowEdge
from JYCalcTemp( @CopyCount )


Ну и потом запрос: select ... from JYCalcTemp( @CopyCount ) where ...

Если добавить поле в JYCalcTemp или в JYCalc - при указанном селекте выдаётся ошибка о несоответствии типов полей. При удалении поля из "базового" вида или функции - выдаётся ошибка о нехватающих полях. Делаю ALTER "дочерней" функции - всё работает.

Отсюда я сделал вывод, что инлайн-функции требуют рекомпиляции (как и виды), если что-то поменялось в объектах (таблицах, видах, функциях) на базе которых они строятся. Может я не прав?
2 июн 03, 13:13    [218196]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпилляция inline-функций  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
Sorry..
вместо
select ... from JYCalcTemp( @CopyCount ) where ...

следует читать
select ... from JYCalcWeekendEdgeTemp( @CopyCount ) where ...
2 июн 03, 13:39    [218245]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпилляция inline-функций  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
2 Алексей К

Отсюда я сделал вывод, что инлайн-функции требуют рекомпиляции (как и виды), если что-то поменялось в объектах (таблицах, видах, функциях) на базе которых они строятся. Может я не прав?

Да нет понятия перекомпиляции для вюшек и функций. sp_refreshview не перекомпилирует вью, а обновляет метаданные для него на основе базовых таблиц. А для функции такой хп я не знаю. Так что тока через ALTER FUNCTION...
2 июн 03, 13:47    [218261]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпилляция inline-функций  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
Во, во, точно, метаданные у инлайн-функции надо обновить...

sp_refreshview, собака, её не берёт...

Так что делать то? ALTER FUNCTION всех функций лениво делать...
Неужели всё так плохо?
2 июн 03, 13:54    [218273]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпилляция inline-функций  [new]
VladimirK
Member

Откуда:
Сообщений: 87
Народ, давай добъем тему.

2 Алексей К:
В БОЛе написано, что sp_recompile заточен под хранимые процедуры и триггеры. Применяю его для инлайн-функции, пишет что пометил её для перекомпиляции, но при её следующем запуске этого не происходит :-(

ВсЁ таки он влияет. Он честно метит и пытается перекомпилировать, я видел в профайлере, но прикол страшный, я отказался от этого. Дело в том что после этого он никак не может перекомпилировать и выдать результат сп. Не могу понять: после пометки на компиляцию инлайн функции, хп с ней из аналайзера выполняется, из программы нет, профайлер показывает бесконечное чередование старт-перекомпиляция. Потом пишет attention. И всЁ тишина. Пока не тормознул сервер не мог выполнить хп из проги.

Как обновлять план функций??? Что он меняется это точно, были тормоза сделал алтер всЁ ОК. Но я не везде могу это сделать, блин тыркнуло меня напрямую вызывать функции для вычисляемых полей, нет бы везде в функции оболочки завернуть.

Свежие мысли есть???
16 сен 03, 17:03    [341150]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпилляция inline-функций  [new]
VladimirK
Member

Откуда:
Сообщений: 87
Пусть мессадж будет повыше ;-)
17 сен 03, 15:49    [342827]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить