Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Производительность процедуры с большим кол-вом серверных объектов. / 17 сообщений из 17, страница 1 из 1
08.11.2005, 19:03
    #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
09.11.2005, 00:11
    #33367839
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность процедуры с большим кол-вом серверных объектов.
Я бы хотя бы добавил else перед всеми последующими после первого IF-ами. Уже стало бы легче.

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

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

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

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

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

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

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

С уважением,
Андрей Колчанов
...
Рейтинг: 0 / 0
10.11.2005, 11:44
    #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
10.11.2005, 13:21
    #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
10.11.2005, 22:40
    #33372333
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность процедуры с большим кол-вом серверных объектов.
_makSimВариант с EXEC не подходит, т.к. нужны права на таблицы всем пользователям (MasterZiv).
Вариант с опцией WITH RECOMPILE эффекта не даёт.


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

А else if повставляли ?
...
Рейтинг: 0 / 0
10.11.2005, 22:41
    #33372334
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность процедуры с большим кол-вом серверных объектов.
Да, на ПЕРВЫЙ запуск плюньте. Это не так важно. Он действительно может быть большим, поскольку планы все строятся. Надо смотреть на время второго запуска.
...
Рейтинг: 0 / 0
11.11.2005, 10:27
    #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
11.11.2005, 12:29
    #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
11.11.2005, 13:51
    #33373629
_makSim
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность процедуры с большим кол-вом серверных объектов.
Спасибо, вещь интересная.

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

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

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

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

2. DbArtisan, SybaseCentral...

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

2. DbArtisan, SybaseCentral...

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

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

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

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

Они ОЧЕНЬ РЕДКО используются. На столько, что сама Sybase про них забывает
в своих собственных продуктах. Например, отладчик процедур и (что самое печальное) серверное API для отладчика не поддерживает отладку таких объектов - там просто номера процедуры не существует как класса.
Поэтому я бы лично не рекомендовал их использовать. Уж лучше добавить
к общему имени процедуры какой-то суффикс. Правда, конечно, права будут
не общие.
...
Рейтинг: 0 / 0
11.11.2005, 23:04
    #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
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Производительность процедуры с большим кол-вом серверных объектов. / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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