Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
Есть хранимая процедура (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 ... ... Т.о. при довольно большом кол-ве таблиц, медленно выполняется процедура (по крайней мере при первом запуске). Чем это объясняется и как с этим можно бороться, если можно (без изменения логики, конечно). Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2005, 19:03 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
Я бы хотя бы добавил else перед всеми последующими после первого IF-ами. Уже стало бы легче. Можно , конечно, и (exec ) применить, но там есть нюансы, например, придется конечным пользователям (всем) давать право на чтение этой таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2005, 00:11 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
Тут дело явно в кол-ве таблиц, а не в кол-ве IF. Напр. процедуда типа: if @p=1 select 1 if @p=2 select 2 ... при гораздо большем количестве IF, отрабатывает за время t->0. Я хотел узнать, что сервер делает с таблицами при вызове процедуры (может, например, доступ проверяет к каждой из них). И как это можно обойти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2005, 10:37 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
Я бы попробовал создать эту процедуру с опцией with recompile и потестить с разными параметрами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2005, 12:14 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
_madcoderЯ бы попробовал создать эту процедуру с опцией with recompile и потестить с разными параметрами. как вариант: собрать кейсом, опираясь на значения переменной, нужный тебе селект (выбрать нужную таблицу) и потом через exec ('собранный селект') выполнить :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2005, 20:35 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
Необходимо понять, в первую очередь, в чем причина медленного выполнения. Проверьте план запроса при первом выполнении (sp_showplan). Если план запроса отличается от оптимального или от того, который строится при выполнении аналогичного запроса вне процедуры с константами в where вместо переменнных, то необходимо вынести запросы в маленькие процедуры где *все* переменные участвующие в where являются параметрами процедуры и перестроить главную процедуру в вид if @par=1 exec ... if @par=2 exec ... ... if @par=3 exec ... if @par=4 exec ... С уважением, Андрей Колчанов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2005, 10:15 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
Вариант с 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 сек. Повторюсь, что выборки простейшие и таблицы с небольшим кол-вом строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2005, 11:44 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
по доброте своей душевной сайбейз пытается построить планы для всего, что есть внутри процедуры, т.к. не может предвидеть содержание входного параметра. на мой взгляд есть единственный выход - групировать процедуру, которая занимается выборкой из таблицы. например так: заменить 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2005, 13:21 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
_makSimВариант с EXEC не подходит, т.к. нужны права на таблицы всем пользователям (MasterZiv). Вариант с опцией WITH RECOMPILE эффекта не даёт. C WITH-RECOMPILE только хуже будет. В смысле времени. А else if повставляли ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2005, 22:40 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
Да, на ПЕРВЫЙ запуск плюньте. Это не так важно. Он действительно может быть большим, поскольку планы все строятся. Надо смотреть на время второго запуска. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2005, 22:41 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
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 А уточните, пожалуйста, вариант группировки процедуры. Не приходилось встречаться. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 10:27 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
_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' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 12:29 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
Спасибо, вещь интересная. Правда, сразу возникли вопросы по использованию таких процедур: 1) Как их чистить(заменять) по одной (drop test;1 - нельзя)? 2) Где их можно редактировать (CAST SQL Builder их не открывает)? 3) Возможно, есть какие-то противопоказания по их использованию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 13:51 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
1. нельзя. по сути с этим надо обращаться как с одной процедурой, разделенной на части 2. DbArtisan, SybaseCentral... 3. не сталкивался ни разу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 18:18 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
Peter Kirillow1. нельзя. по сути с этим надо обращаться как с одной процедурой, разделенной на части 2. DbArtisan, SybaseCentral... 3. не сталкивался ни разу интересно, для чего это (группировка) вообще задумывалось? область применения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 18:23 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
1) Как их чистить(заменять) по одной (drop test;1 - нельзя)? Дропаются они все сразу, по "родовому" имени. 2) Где их можно редактировать (CAST SQL Builder их не открывает)? Да где угодно. В любом редактроре текстовом. Надо только помнить, что они удаляются одновременно, но создаются по отдельности. И кажется еще права у них тоже единые -- не помню. 3) Возможно, есть какие-то противопоказания по их использованию? Они ОЧЕНЬ РЕДКО используются. На столько, что сама Sybase про них забывает в своих собственных продуктах. Например, отладчик процедур и (что самое печальное) серверное API для отладчика не поддерживает отладку таких объектов - там просто номера процедуры не существует как класса. Поэтому я бы лично не рекомендовал их использовать. Уж лучше добавить к общему имени процедуры какой-то суффикс. Правда, конечно, права будут не общие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 22:59 |
|
||
|
Производительность процедуры с большим кол-вом серверных объектов.
|
|||
|---|---|---|---|
|
#18+
Да, и если такая пьянка пошла , напомню про возможность нединамического косвенного вызова процедуры, которая недокументирована, но испокон веку работала в ASE Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 23:04 |
|
||
|
|

start [/forum/topic.php?fid=55&fpage=94&tid=2013267]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 358ms |

| 0 / 0 |
