powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / sp_recompile не перекомпилит процедуру
8 сообщений из 8, страница 1 из 1
sp_recompile не перекомпилит процедуру
    #39527187
ferey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

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

USE Base
GO
exec sp_recompile 'STORED_PROC_NAME'
GO

возвращает, что этот объект - не таблица.
Эта процедура имеет ещё ряд вложенных процедур, WITH RECOMPILE не подойдет.
Прошу указать, в чем проблема и как можно решить?
...
Рейтинг: 0 / 0
sp_recompile не перекомпилит процедуру
    #39527416
SAV4SAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
sp_recompile не перекомпилит процедуру
    #39527502
ferey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SAV4SAV,

Спасибо.
Возможно ли каким-то образом перекомпилировать процедуру с рядом вложенных процедур, не прибегая к WITH RECOMPILE?
Есть ли в sybase какая-нибудь иная процедура, схожая с sp_recompile, которая действует в отношении к процедурам?
...
Рейтинг: 0 / 0
sp_recompile не перекомпилит процедуру
    #39527575
SAV4SAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferey,
"WITH RECOMPILE не подойдет" -
имелось в виду exec <sored_proc_name> with recompile, или Create Proc ... with recompile ?

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

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


К примеру
Код: sql
1.
2.
3.
4.
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
Но приведет ли это к рекомпиляции ?
...
Рейтинг: 0 / 0
sp_recompile не перекомпилит процедуру
    #39527590
SAV4SAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferey,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
-- так можно увидеть, что работает
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
...
Рейтинг: 0 / 0
sp_recompile не перекомпилит процедуру
    #39527594
ferey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SAV4SAV,

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

Благодарю за подсказку, но юзать боязно)
...
Рейтинг: 0 / 0
sp_recompile не перекомпилит процедуру
    #39527895
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fereySAV4SAV,

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

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

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

Зачем вручную перекомпилировать одну хранимую процедуру я не могу придумать. Ну если очень хочется, самое простое:
Код: sql
1.
2.
3.
4.
drop procedure STORED_PROC_NAME
go
create procedure STORED_PROC_NAME as ...
go
...
Рейтинг: 0 / 0
sp_recompile не перекомпилит процедуру
    #39547932
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fereySAV4SAV,

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

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


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

sp_depends

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

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

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

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

Так что все зависит от того, для чего вы там это пытаетесь запилить. Если для переформулирования логики процедур, то sp_recompile было бы мало, надо drop/create, если для пересоздания планов, то они и так должны пересоздаваться, если это не происходит, то можно писать репорт о баге в ASE.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / sp_recompile не перекомпилит процедуру
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]