powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Производительность процедуры с большим кол-вом серверных объектов.
17 сообщений из 17, страница 1 из 1
Производительность процедуры с большим кол-вом серверных объектов.
    #33367562
_makSim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть хранимая процедура (ASE 12.5), результатом выполнения которой является выборка (простейший select) из 1 таблицы с небольшим кол-вом записей (<1000). Но то, из какой именно таблицы и с какими условиями будет выполняться select, определяет параметр.

if @par=1 select ... from t1 ...
if @par=2 select ... from t1 ...
...
if @par=3 select ... from t2 ...
if @par=4 select ... from t2 ...
...

Т.о. при довольно большом кол-ве таблиц, медленно выполняется процедура (по крайней мере при первом запуске). Чем это объясняется и как с этим можно бороться, если можно (без изменения логики, конечно).
Спасибо.
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33367839
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы хотя бы добавил else перед всеми последующими после первого IF-ами. Уже стало бы легче.

Можно , конечно, и (exec ) применить, но там есть нюансы, например, придется конечным пользователям (всем) давать право на чтение этой таблицы.
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33368293
_makSim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут дело явно в кол-ве таблиц, а не в кол-ве IF. Напр. процедуда типа:

if @p=1 select 1
if @p=2 select 2
...

при гораздо большем количестве IF, отрабатывает за время t->0.

Я хотел узнать, что сервер делает с таблицами при вызове процедуры (может, например, доступ проверяет к каждой из них). И как это можно обойти?
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33368587
_madcoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы попробовал создать эту процедуру с опцией with recompile и потестить с разными параметрами.
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33369961
sybdba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_madcoderЯ бы попробовал создать эту процедуру с опцией with recompile и потестить с разными параметрами.

как вариант:
собрать кейсом, опираясь на значения переменной, нужный тебе селект (выбрать нужную таблицу) и потом через exec ('собранный селект') выполнить :)
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33370345
kolchanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Необходимо понять, в первую очередь, в чем причина медленного выполнения.
Проверьте план запроса при первом выполнении (sp_showplan).

Если план запроса отличается от оптимального или от того, который строится при выполнении аналогичного запроса вне процедуры с константами в where вместо переменнных, то необходимо вынести запросы в маленькие процедуры где *все* переменные участвующие в where являются параметрами процедуры
и перестроить главную процедуру в вид

if @par=1 exec ...
if @par=2 exec ...
...
if @par=3 exec ...
if @par=4 exec ...

С уважением,
Андрей Колчанов
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33370658
_makSim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант с EXEC не подходит, т.к. нужны права на таблицы всем пользователям (MasterZiv).
Вариант с опцией WITH RECOMPILE эффекта не даёт.

По плану трудно что-то сказать. Привожу план для одной строки процедуры:

QUERY PLAN FOR STATEMENT 508 (at line 331).
STEP 1
The type of query is COND.

QUERY PLAN FOR STATEMENT 509 (at line 331).
STEP 1
The type of query is INSERT.
The update mode is direct.
Worktable1 created, in allpages locking mode, for ORDER BY.
FROM TABLE
MyTableX
Nested iteration.
Table Scan.
Forward scan.
Positioning at start of table.
Using I/O Size 2 Kbytes for data pages.
With LRU Buffer Replacement Strategy for data pages.
TO TABLE
Worktable1.
STEP 2
The type of query is SELECT.
This step involves sorting.
FROM TABLE
Worktable1.
Using GETSORTED
Table Scan.
Forward scan.
Positioning at start of table.
Using I/O Size 2 Kbytes for data pages.
With MRU Buffer Replacement Strategy for data pages.

Строк таких около 1000. Время выполнения процедуры 3-4 сек.


Повторюсь, что выборки простейшие и таблицы с небольшим кол-вом строк.
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33371061
Peter Kirillow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по доброте своей душевной сайбейз пытается построить планы для всего, что есть внутри процедуры, т.к. не может предвидеть содержание входного параметра.

на мой взгляд есть единственный выход - групировать процедуру, которая занимается выборкой из таблицы. например так:
заменить

if @par=1 select ... from t1 ...
if @par=2 select ... from t1 ...
...
if @par=33 select ... from t2 ...
if @par=44 select ... from t2 ...

на

if @par=1 exec proc;1
if @par=2 exec proc;2
...
if @par=33 exec proc;33
if @par=44 exec proc;44

ну а соответствующие селекты переместить в нужную группу новой процедуры proc.
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33372333
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_makSimВариант с EXEC не подходит, т.к. нужны права на таблицы всем пользователям (MasterZiv).
Вариант с опцией WITH RECOMPILE эффекта не даёт.


C WITH-RECOMPILE только хуже будет. В смысле времени.

А else if повставляли ?
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33372334
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, на ПЕРВЫЙ запуск плюньте. Это не так важно. Он действительно может быть большим, поскольку планы все строятся. Надо смотреть на время второго запуска.
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33372789
_makSim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Peter Kirillowпо доброте своей душевной сайбейз пытается построить
на мой взгляд есть единственный выход - групировать процедуру, которая занимается выборкой из таблицы. например так:
if @par=1 exec proc;1
if @par=2 exec proc;2
...
if @par=33 exec proc;33
if @par=44 exec proc;44


А уточните, пожалуйста, вариант группировки процедуры. Не приходилось встречаться. :)
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33373296
sybdba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_makSim Peter Kirillowпо доброте своей душевной сайбейз пытается построить
на мой взгляд есть единственный выход - групировать процедуру, которая занимается выборкой из таблицы. например так:
if @par=1 exec proc;1
if @par=2 exec proc;2
...
if @par=33 exec proc;33
if @par=44 exec proc;44


А уточните, пожалуйста, вариант группировки процедуры. Не приходилось встречаться. :)

старая как мир вещь - можно создавать процедуры с одним и тем же именем, но с разными номерами
например :

create proc test;1
as
begin
select getdate()
end
go
create proc test;2
as
begin
select @@version
end
go
exec test;1
go
exec test;2
go
sp_helptext test
go

+ надо проверить sp_configure 'allow procedure grouping'
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33373629
_makSim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, вещь интересная.

Правда, сразу возникли вопросы по использованию таких процедур:

1) Как их чистить(заменять) по одной (drop test;1 - нельзя)?

2) Где их можно редактировать (CAST SQL Builder их не открывает)?

3) Возможно, есть какие-то противопоказания по их использованию?
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33374434
Peter Kirillow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. нельзя. по сути с этим надо обращаться как с одной процедурой, разделенной на части

2. DbArtisan, SybaseCentral...

3. не сталкивался ни разу
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33374448
sybdba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Peter Kirillow1. нельзя. по сути с этим надо обращаться как с одной процедурой, разделенной на части

2. DbArtisan, SybaseCentral...

3. не сталкивался ни разу

интересно, для чего это (группировка) вообще задумывалось? область применения?
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33374760
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Как их чистить(заменять) по одной (drop test;1 - нельзя)?
Дропаются они все сразу, по "родовому" имени.

2) Где их можно редактировать (CAST SQL Builder их не открывает)?
Да где угодно. В любом редактроре текстовом.
Надо только помнить, что они удаляются одновременно, но создаются
по отдельности. И кажется еще права у них тоже единые -- не помню.

3) Возможно, есть какие-то противопоказания по их использованию?

Они ОЧЕНЬ РЕДКО используются. На столько, что сама Sybase про них забывает
в своих собственных продуктах. Например, отладчик процедур и (что самое печальное) серверное API для отладчика не поддерживает отладку таких объектов - там просто номера процедуры не существует как класса.
Поэтому я бы лично не рекомендовал их использовать. Уж лучше добавить
к общему имени процедуры какой-то суффикс. Правда, конечно, права будут
не общие.
...
Рейтинг: 0 / 0
Производительность процедуры с большим кол-вом серверных объектов.
    #33374763
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и если такая пьянка пошла , напомню про возможность нединамического косвенного вызова процедуры, которая недокументирована, но испокон веку работала в ASE
Код: plaintext
1.
2.
3.
declare @proc varchar( 30 ), @rc int
select @proc = "my_proc" + "aaa" + "eee"
exec @rc = @proc @par1, "qqq", @par3, -- etc
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Производительность процедуры с большим кол-вом серверных объектов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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