|
|
|
проблема с вызовом большого числа SP в одной query
|
|||
|---|---|---|---|
|
#18+
Приложение регулярно футболит на ASE сервер такие запросы (читаем данные из канала и пишем в базу): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Количество 'exec' в одном запросе порядка 1000. Запросы шлютя через JConnect. Время уходящее на вызов statement.execute ~ 1-3 секунд, Затем, по спецификации, делается "опорожнение" результатов. Что-то вроде такого: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Если выполнить запрос в AquaDataStudio, оказывается что выхлоп от одной процедуры примерно такой: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Судя по докам "тупо" игнорировать результаты выполнения statement нельзя, т.к. при закрытии не прочтанного statement будет слаться cancel, который может привести неизвестно к чему. В связи с этим вопрос. Что это за "1 record(s) affected " и нельзя ли как-то уменьшить выхлоп, который приходится вычитывать из базы? Может можно культорно сказать базе, что ничего кроме ошибок присылать взад не нужно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2008, 12:12 |
|
||
|
проблема с вызовом большого числа SP в одной query
|
|||
|---|---|---|---|
|
#18+
можно сразу после коннекта послать "set nocount ..." это избавит от сообщений типа "ХХХ record(s) affected" но если вопрос в быстродействии, советую посылать этот запрос не одним большим батчем... если запускаете одну и ту-же процедуру с разными параметрами, то значительно быстрее будет если делать один раз prepare statement, затем вызывать в цикле подставляя параметры (setXXX). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2008, 12:36 |
|
||
|
проблема с вызовом большого числа SP в одной query
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2008, 12:50 |
|
||
|
проблема с вызовом большого числа SP в одной query
|
|||
|---|---|---|---|
|
#18+
Dmitry..можно сразу после коннекта послать "set nocount ..." это избавит от сообщений типа "ХХХ record(s) affected" Thnx, попробую. Dmitry.. но если вопрос в быстродействии, советую посылать этот запрос не одним большим батчем... Хмм. Раньше приложение кидало по 2-10 exec'ов, после чего переключились на большие значения и обнаружился прирост производительности. Отставание базы от канала сократилось довольно ощутимо... Dmitry.. если запускаете одну и ту-же процедуру с разными параметрами, то значительно быстрее будет если делать один раз prepare statement, затем вызывать в цикле подставляя параметры (setXXX). В зависимости от типа сообщений дёргаются разные процедуры, но это ладно. А как быть с "if @@error!=0 exec bla_abort_batch"? Если nocount никак не поможет, попробую в эту сторону рыть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2008, 13:10 |
|
||
|
проблема с вызовом большого числа SP в одной query
|
|||
|---|---|---|---|
|
#18+
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. Но при этом getMoreResults() всё равно не выкидывайте. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2008, 13:49 |
|
||
|
проблема с вызовом большого числа SP в одной query
|
|||
|---|---|---|---|
|
#18+
Dmitry.. wrote: > Автор: Dmitry.. > можно сразу после коннекта послать "set nocount ..." > это избавит от сообщений типа "ХХХ record(s) affected" > Нет, надо ещё в процедурах его ставить. Можно ставить также и снаружи, конечно. > но если вопрос в быстродействии, советую посылать этот запрос не одним > большим батчем... Да это всё равно. > если запускаете одну и ту-же процедуру с разными параметрами, то > _значительно_ быстрее будет если делать один раз prepare statement, > затем вызывать в цикле подставляя параметры (setXXX). нет, как раз при вызове процедуры prepared statement использовать абсолютно бессмысленно. Параметры - можно. Но без подготовки. Подготовка вам создаёт временную процедуру из запроса. В нашем случае весь запрос - вызов другой процедуры, так что подготовка не имеет никакого смысла. Можно еще (это - самый быстрый способ) использовать RPC запросы вместо языковых, но я не знаю, поддерживает ли их JDBC. Если и поддерживает, то это должно быть какое-то расширение именно ASE-шного драйвера. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2008, 13:52 |
|
||
|
проблема с вызовом большого числа SP в одной query
|
|||
|---|---|---|---|
|
#18+
NotGonnaGetUs wrote: > В зависимости от типа сообщений дёргаются разные процедуры, но это ладно. > А как быть с "if @@error!=0 exec bla_abort_batch"? у вас есть код возврата процедуры, вы по идее можете анализировать вмето @error-а его. И это даже более правильно. Но беда в том, что формировать его должна сама процедура,и вы должны быть уверены, что это там делается правильно. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2008, 13:54 |
|
||
|
проблема с вызовом большого числа SP в одной query
|
|||
|---|---|---|---|
|
#18+
MasterZiv Dmitry.. wrote: > Автор: Dmitry.. > можно сразу после коннекта послать "set nocount ..." > это избавит от сообщений типа "ХХХ record(s) affected" > Нет, надо ещё в процедурах его ставить. Можно ставить также и снаружи, конечно. Хмм.. Поставил только снаружи. Тесты в AquaDataStudio показывают, что строчки "affected" исчезли. Ускорее (на глаз) процентов на 30%. Точные замеры ещё буду делать... [quot] Можно еще (это - самый быстрый способ) использовать RPC запросы вместо языковых, но я не знаю, поддерживает ли их JDBC. Если и поддерживает, то это должно быть какое-то расширение именно ASE-шного драйвера. [/quot] А в чём его "быстрота"? Позволяет меньше данных гонять от приложения к серверу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2008, 15:38 |
|
||
|
проблема с вызовом большого числа SP в одной query
|
|||
|---|---|---|---|
|
#18+
NotGonnaGetUs wrote: > Хмм.. Поставил только снаружи. Тесты в AquaDataStudio показывают, что > строчки "affected" исчезли. > Ускорее (на глаз) процентов на 30%. Точные замеры ещё буду делать... Я не говорю, что так работать не будет. Но лучше наверное всё же не зависеть от клиента и поставить в процедурах. > > Можно еще (это - самый быстрый способ) использовать RPC запросы > вместо языковых, но я не знаю, поддерживает ли их JDBC. Если и > поддерживает, то это должно быть какое-то расширение именно ASE-шного > драйвера. > > А в чём его "быстрота"? Позволяет меньше данных гонять от приложения к > серверу? Нет, позволяет серверу не парсить языковые запросы и не строить на них планы. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2008, 18:46 |
|
||
|
|

start [/forum/topic.php?fid=55&fpage=45&tid=2011335]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 234ms |
| total: | 380ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...