Добро пожаловать в форум, 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

Откуда:
Сообщений: 153
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

Откуда:
Сообщений: 153
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

Откуда:
Сообщений: 153
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

Откуда:
Сообщений: 12049
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]     Ответить | Цитировать Сообщить модератору
Все форумы / Sybase ASA, ASE, IQ Ответить