powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / проблема с вызовом большого числа SP в одной query
9 сообщений из 9, страница 1 из 1
проблема с вызовом большого числа SP в одной query
    #35590922
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приложение регулярно футболит на ASE сервер
такие запросы (читаем данные из канала и пишем в базу):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
begin tran

exec bla-bla @p1=..,@p2=..., ... @p32=...
if @@error!= 0  exec bla_abort_batch

exec bla-bla @p1=..,@p2=..., ... @p32=...
if @@error!= 0  exec bla_abort_batch
...
exec bla-bla @p1=..,@p2=..., ... @p32=...
if @@error!= 0  exec bla_abort_batch

commit tran

Количество 'exec' в одном запросе порядка 1000.


Запросы шлютя через JConnect.

Время уходящее на вызов statement.execute ~ 1-3 секунд,
Затем, по спецификации, делается "опорожнение" результатов.

Что-то вроде такого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
                boolean b = st.execute(statmt);
                while (true)
                {
                    if (!b && st.getUpdateCount() == - 1 )
                    {
                        break;
                    }
                    b = st.getMoreResults();
                }
Как оказалось на getMoreResults уходит ещё от 5 до 10 секунд.


Если выполнить запрос в AquaDataStudio, оказывается что выхлоп от одной процедуры примерно такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  1  record(s) affected 
  1  record(s) affected 
 ...
  1  record(s) affected 
  1  record(s) affected 
  1  record(s) affected 
  1  record(s) affected   <--- всего около 60 штук
column1    
 ---------- 
 D           
 1  record(s) selected [Fetch MetaData:  453 /ms] [Fetch Data:  0 /ms]  
column1    
 ---------- 
 O           
 1  record(s) selected [Fetch MetaData:  63 /ms] [Fetch Data:  0 /ms] 
                             <---- пара никому не нужных значений

Судя по докам "тупо" игнорировать результаты выполнения statement нельзя, т.к. при закрытии не прочтанного statement будет слаться cancel, который может привести неизвестно к чему.

В связи с этим вопрос. Что это за "1 record(s) affected " и нельзя ли как-то уменьшить выхлоп, который приходится вычитывать из базы? Может можно культорно сказать базе, что ничего кроме ошибок присылать взад не нужно?
...
Рейтинг: 0 / 0
проблема с вызовом большого числа SP в одной query
    #35590992
Dmitry..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно сразу после коннекта послать "set nocount ..."
это избавит от сообщений типа "ХХХ record(s) affected"

но если вопрос в быстродействии, советую посылать этот запрос не одним большим батчем...

если запускаете одну и ту-же процедуру с разными параметрами, то значительно быстрее будет если делать один раз prepare statement, затем вызывать в цикле подставляя параметры (setXXX).
...
Рейтинг: 0 / 0
проблема с вызовом большого числа SP в одной query
    #35591027
moris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также еще посмотрите сюда для ASE12.5.X и сюда для ASE15
...
Рейтинг: 0 / 0
проблема с вызовом большого числа SP в одной query
    #35591086
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry..можно сразу после коннекта послать "set nocount ..."
это избавит от сообщений типа "ХХХ record(s) affected"

Thnx, попробую.

Dmitry..
но если вопрос в быстродействии, советую посылать этот запрос не одним большим батчем...

Хмм.
Раньше приложение кидало по 2-10 exec'ов, после чего переключились на большие значения и обнаружился прирост производительности. Отставание базы от канала сократилось довольно ощутимо...


Dmitry..
если запускаете одну и ту-же процедуру с разными параметрами, то значительно быстрее будет если делать один раз prepare statement, затем вызывать в цикле подставляя параметры (setXXX).
В зависимости от типа сообщений дёргаются разные процедуры, но это ладно.
А как быть с "if @@error!=0 exec bla_abort_batch"?

Если nocount никак не поможет, попробую в эту сторону рыть.
...
Рейтинг: 0 / 0
проблема с вызовом большого числа SP в одной query
    #35591201
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs wrote:
> Приложение регулярно футболит на ASE сервер
> такие запросы (читаем данные из канала и пишем в базу):
>
> begin tran
>
> exec bla-bla @p1=..,@p2=..., ... @p32=...
> if @@error!=*0* exec bla_abort_batch
>
> exec bla-bla @p1=..,@p2=..., ... @p32=...
> if @@error!=*0* exec bla_abort_batch
> ..
> exec bla-bla @p1=..,@p2=..., ... @p32=...
> if @@error!=*0* exec bla_abort_batch
>
> commit tran
>
>
> Количество 'exec' в одном запросе порядка 1000.
>
>
> Запросы шлютя через JConnect.

Единственное замечание - НЕ ИСПОЛЬЗУЙТЕ подготовленные запросы.

> Затем, по спецификации, делается "опорожнение" результатов.
>
> Что-то вроде такого:
>
> boolean b = st.execute(statmt);
> while (true)
> {
> if (!b && st.getUpdateCount() == -1)
> {
> break;
> }
> b = st.getMoreResults();
> }

> Как оказалось на getMoreResults уходит ещё от 5 до 10 секунд.

Это время нельзя отделять от времени выполнения всего запроса.

Дело в том, что последние процедуры могут и не начать даже выполняться,
пока вы не вызовите этот самый getMoreResults().

> Судя по докам "тупо" игнорировать результаты выполнения statement
> нельзя, т.к. при закрытии не прочтанного statement будет слаться cancel,
> который может привести неизвестно к чему.

Да. Это правильно.

> В связи с этим вопрос. Что это за "1 record(s) affected " и нельзя ли
> как-то уменьшить выхлоп, который приходится вычитывать из базы? Может
> можно культорно сказать базе, что ничего кроме ошибок присылать взад не
> нужно?
Да, можно. В процедурах надо указать (в начале каждой)
Код: plaintext
1.
set nocount on

Но при этом getMoreResults() всё равно не выкидывайте.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
проблема с вызовом большого числа SP в одной query
    #35591213
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.. wrote:
> Автор: Dmitry..
> можно сразу после коннекта послать "set nocount ..."
> это избавит от сообщений типа "ХХХ record(s) affected"
>

Нет, надо ещё в процедурах его ставить. Можно ставить также и снаружи,
конечно.

> но если вопрос в быстродействии, советую посылать этот запрос не одним
> большим батчем...

Да это всё равно.

> если запускаете одну и ту-же процедуру с разными параметрами, то
> _значительно_ быстрее будет если делать один раз prepare statement,
> затем вызывать в цикле подставляя параметры (setXXX).

нет, как раз при вызове процедуры prepared statement использовать
абсолютно бессмысленно. Параметры - можно. Но без подготовки.

Подготовка вам создаёт временную процедуру из запроса.
В нашем случае весь запрос - вызов другой процедуры, так что
подготовка не имеет никакого смысла.

Можно еще (это - самый быстрый способ) использовать RPC запросы
вместо языковых, но я не знаю, поддерживает ли их JDBC. Если и
поддерживает, то это должно быть какое-то расширение именно ASE-шного
драйвера.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
проблема с вызовом большого числа SP в одной query
    #35591217
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs wrote:

> В зависимости от типа сообщений дёргаются разные процедуры, но это ладно.
> А как быть с "if @@error!=0 exec bla_abort_batch"?
у вас есть код возврата процедуры, вы по идее можете анализировать
вмето @error-а его. И это даже более правильно. Но беда в том,
что формировать его должна сама процедура,и вы должны быть уверены,
что это там делается правильно.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
проблема с вызовом большого числа SP в одной query
    #35591538
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Dmitry.. wrote:
> Автор: Dmitry..
> можно сразу после коннекта послать "set nocount ..."
> это избавит от сообщений типа "ХХХ record(s) affected"
>

Нет, надо ещё в процедурах его ставить. Можно ставить также и снаружи,
конечно.


Хмм.. Поставил только снаружи. Тесты в AquaDataStudio показывают, что строчки "affected" исчезли.
Ускорее (на глаз) процентов на 30%. Точные замеры ещё буду делать...

[quot]
Можно еще (это - самый быстрый способ) использовать RPC запросы
вместо языковых, но я не знаю, поддерживает ли их JDBC. Если и
поддерживает, то это должно быть какое-то расширение именно ASE-шного
драйвера.
[/quot]
А в чём его "быстрота"? Позволяет меньше данных гонять от приложения к серверу?
...
Рейтинг: 0 / 0
проблема с вызовом большого числа SP в одной query
    #35592092
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs wrote:

> Хмм.. Поставил только снаружи. Тесты в AquaDataStudio показывают, что
> строчки "affected" исчезли.
> Ускорее (на глаз) процентов на 30%. Точные замеры ещё буду делать...

Я не говорю, что так работать не будет. Но лучше наверное
всё же не зависеть от клиента и поставить в процедурах.

>
> Можно еще (это - самый быстрый способ) использовать RPC запросы
> вместо языковых, но я не знаю, поддерживает ли их JDBC. Если и
> поддерживает, то это должно быть какое-то расширение именно ASE-шного
> драйвера.
>
> А в чём его "быстрота"? Позволяет меньше данных гонять от приложения к
> серверу?

Нет, позволяет серверу не парсить языковые запросы и не строить на них
планы.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / проблема с вызовом большого числа SP в одной query
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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