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

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

USE Base
GO
exec sp_recompile 'STORED_PROC_NAME'
GO

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

Спасибо.
Возможно ли каким-то образом перекомпилировать процедуру с рядом вложенных процедур, не прибегая к WITH RECOMPILE?
Есть ли в sybase какая-нибудь иная процедура, схожая с sp_recompile, которая действует в отношении к процедурам?
...
Рейтинг: 0 / 0
28.09.2017, 11:51
    #39527575
SAV4SAV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sp_recompile не перекомпилит процедуру
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
28.09.2017, 12:14
    #39527590
SAV4SAV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sp_recompile не перекомпилит процедуру
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
28.09.2017, 12:22
    #39527594
ferey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sp_recompile не перекомпилит процедуру
SAV4SAV,

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

Благодарю за подсказку, но юзать боязно)
...
Рейтинг: 0 / 0
28.09.2017, 18:00
    #39527895
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sp_recompile не перекомпилит процедуру
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
05.11.2017, 03:04
    #39547932
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sp_recompile не перекомпилит процедуру
fereySAV4SAV,

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

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


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

sp_depends

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

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

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

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

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


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