Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Sybase ASA, ASE, IQ Новый топик    Ответить
 sp_recompile не перекомпилит процедуру  [new]
ferey
Member

Откуда:
Сообщений: 3
Добрый день!

На sybase пишу запрос на перекомпилирование процедуры:

USE Base
GO
exec sp_recompile 'STORED_PROC_NAME'
GO

возвращает, что этот объект - не таблица.
Эта процедура имеет ещё ряд вложенных процедур, WITH RECOMPILE не подойдет.
Прошу указать, в чем проблема и как можно решить?
27 сен 17, 15:54    [20827088]     Ответить | Цитировать Сообщить модератору
 Re: sp_recompile не перекомпилит процедуру  [new]
SAV4SAV
Member

Откуда:
Сообщений: 155
ferey,
sp_recompile -
Marks stored procedures and triggers related to a specified table for recompilation when they next run.
sp_recompile objname
Parameter information :

» objname : Name of a table.
28 сен 17, 08:15    [20828092]     Ответить | Цитировать Сообщить модератору
 Re: sp_recompile не перекомпилит процедуру  [new]
ferey
Member

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

Спасибо.
Возможно ли каким-то образом перекомпилировать процедуру с рядом вложенных процедур, не прибегая к WITH RECOMPILE?
Есть ли в sybase какая-нибудь иная процедура, схожая с sp_recompile, которая действует в отношении к процедурам?
28 сен 17, 10:24    [20828386]     Ответить | Цитировать Сообщить модератору
 Re: sp_recompile не перекомпилит процедуру  [new]
SAV4SAV
Member

Откуда:
Сообщений: 155
ferey,
"WITH RECOMPILE не подойдет" -
имелось в виду exec <sored_proc_name> with recompile, или Create Proc ... with recompile ?

Атак, для ASE 12.5.3 я такой команды не знаю. Может что изменилось в младших версиях ...

На свой страх и риск (нет внятных описаний) можно попробовать что-то из этого


К примеру
dbcc traceon(3604)
go
dbcc procbuf(dbid, objid, nbufs, printopt = { 0 | 1 }, tree_plan) -- посмотреть
dbcc cacheremove(dbid|dbname, objid|objname) -- удалить указатель на процедуру


Или
dbcc proc_cacherm(type, dbname, objname)
Version
- Added prior to 11.9
Usage
- type is V,P,T,R,D,C,F, or S (must be uppercase)
- corresponds to View, Proc, Trigger, Rule, Default, Cursor, SQLJ Function, SQL function
- Must have sybase_ts_role to execute
-
- Objects removed from cache may need to be read from disk and recompiled
Но приведет ли это к рекомпиляции ?
28 сен 17, 11:51    [20828705]     Ответить | Цитировать Сообщить модератору
 Re: sp_recompile не перекомпилит процедуру  [new]
SAV4SAV
Member

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

-- так можно увидеть, что работает
use sybsystemprocs
go
exec sp_configure 'enable monitoring'
go
exec sp_configure 'enable monitoring', 1
go

exec sp_who
go

select *
from master..monCachedProcedures where ObjectName = 'sp_who'
go

select case ObjectType
		 when 'stored procedure' then 'dbcc proc_cacherm(P,' + DBName + ',' + ObjectName + ')'
		 when 'trigger procedure' then 'dbcc proc_cacherm(T,' + DBName + ',' + ObjectName + ')' 
		 when 'view'then 'dbcc proc_cacherm(V,' + DBName + ',' + ObjectName + ')' 
		 when 'default value spec' then 'dbcc proc_cacherm(D,' + DBName + ',' + ObjectName + ')' 
		 when 'rule' then 'dbcc proc_cacherm(R,' + DBName + ',' + ObjectName + ')' 
	   end
from master..monCachedProcedures where ObjectName = 'sp_who'
go

dbcc proc_cacherm(P,sybsystemprocs,sp_who)
go

select *
from master..monCachedProcedures where ObjectName = 'sp_who'
go

exec sp_who
go

select *
from master..monCachedProcedures where ObjectName = 'sp_who'
go

-- и так тоже работает

select db_id(), object_id('dbo.sp_who')
go -- 31514	348525244
dbcc cacheremove(31514, 348525244)
go
select *
from master..monCachedProcedures where ObjectName = 'sp_who'
go 
--
exec sp_configure 'enable monitoring', 0
go
28 сен 17, 12:14    [20828768]     Ответить | Цитировать Сообщить модератору
 Re: sp_recompile не перекомпилит процедуру  [new]
ferey
Member

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

Рекомпил при операции exec 'STORED_PROC'
В 'STORED_PROC' так же имеется ряд вложенных процедур, хотелось бы иметь вариант, в котором не нужно в каждой вложенной процедуре прописывать WITH RECOMPILE после каждой операции CREATE PROC в них.

Благодарю за подсказку, но юзать боязно)
28 сен 17, 12:22    [20828783]     Ответить | Цитировать Сообщить модератору
 Re: sp_recompile не перекомпилит процедуру  [new]
White Owl
Member

Откуда:
Сообщений: 12115
ferey
SAV4SAV,

Рекомпил при операции exec 'STORED_PROC'
В 'STORED_PROC' так же имеется ряд вложенных процедур, хотелось бы иметь вариант, в котором не нужно в каждой вложенной процедуре прописывать WITH RECOMPILE после каждой операции CREATE PROC в них.

Благодарю за подсказку, но юзать боязно)
А зачем тебе перекомпилировать процедуру?

Смысл в этом есть только чтобы процедура использовала более актуальные планы, но актуальность планов меняется только после большого обновления таблиц участвующих в запросах. На практике это значит: загрузил много новых данных в таблицу, обновил много данных, удалил много строк - запускаешь на эту таблицу sp_recompile и все проблемы исчезают.

Зачем вручную перекомпилировать одну хранимую процедуру я не могу придумать. Ну если очень хочется, самое простое:
drop procedure STORED_PROC_NAME
go
create procedure STORED_PROC_NAME as ...
go
28 сен 17, 18:00    [20829905]     Ответить | Цитировать Сообщить модератору
 Re: sp_recompile не перекомпилит процедуру  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 33575
ferey
SAV4SAV,

Рекомпил при операции exec 'STORED_PROC'
В 'STORED_PROC' так же имеется ряд вложенных процедур, хотелось бы иметь вариант, в котором не нужно в каждой вложенной процедуре прописывать WITH RECOMPILE после каждой операции CREATE PROC в них.

Благодарю за подсказку, но юзать боязно)



сначала рекурсивно надо вызывать

sp_depends

Но только по процедурам рекурсию выстраивать,

затем можно стирать нацеленные процедуры из кэша через указанный выше
DBCC

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

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

Так что все зависит от того, для чего вы там это пытаетесь запилить. Если для переформулирования логики процедур, то sp_recompile было бы мало, надо drop/create, если для пересоздания планов, то они и так должны пересоздаваться, если это не происходит, то можно писать репорт о баге в ASE.
5 ноя 17, 03:04    [20928093]     Ответить | Цитировать Сообщить модератору
Все форумы / Sybase ASA, ASE, IQ Ответить