|
Sybase ASE ODBC производительность
|
|||
---|---|---|---|
#18+
Здравствуйте, Наше приложение написано на .net(c#), к базе (ASE 15.7) коннектимся через ODBC, используя ADO.NET ODBC провайдеры(System.Data.Odbc). Последнее время стали замечать что производительность на больших выборках заметно падает. Таблица 43 колонки, ~100 000 строк, отображается за ~ 40 сек, но если этот же запрос выполнить в Interactive SQL, то выборка отработает за ~6 сек. "Раскопки", показали что, ADO.NET ODBC провайдер работает используя функцию SQLGetData(). Написав на C++ два тестовых примера, один с SQLGetData(), второй с SQLBindCol(), выяснили что при с SQLBindCol(), производительность повысилась и достигла уровня как в Interactive SQL. Вопрос: Кто виноват? Sybase с тем что его SQLGetData() работает медленно, или Microsoft из-за использования в обертке(ADO.NET ODBC провайдер) медленной функции SQLGetData()? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 11:43 |
|
Sybase ASE ODBC производительность
|
|||
---|---|---|---|
#18+
_devel, Могу предположить, что в первом случае с GetData приложение ждет до конца получения всех данных, а в другом случае вначале отображает небольшое кол-во строк и уже потом в фоновом режиме "дочитывает" остальные данные, таким же образом работает и Interactive SQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 13:04 |
|
Sybase ASE ODBC производительность
|
|||
---|---|---|---|
#18+
Nashville, Неа, в обоих случаях вызывается SQLFetch(). Так что вряд ли "ждет до конца получения всех данных". С SQLBindCol() Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
С SQLGetData() Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 14:06 |
|
Sybase ASE ODBC производительность
|
|||
---|---|---|---|
#18+
_devel, Retrieving data using the SQLBindCol function instead of using the SQLGetData function reduces the number of ODBC calls, and ultimately the number of network round trips, improving performance. http://cdn.ttgtmedia.com/searchDataManagement/downloads/DataAccessHandbook_CH05.pdf и еще одна ссылка на Sybase http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc01776.1600/doc/html/saiq-retrieving-working-odbcdev.html ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 14:54 |
|
Sybase ASE ODBC производительность
|
|||
---|---|---|---|
#18+
_devel, А зачем же вам сто тысяч записей? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 15:14 |
|
Sybase ASE ODBC производительность
|
|||
---|---|---|---|
#18+
MasterZiv_devel, А зачем же вам сто тысяч записей? Не сыпьте мне соль на рану MasterZiv. Так требует заказчик. Подозреваю что до нашей системы они работали с экселем, и чтоб каждый раз не просить IT-службу достать какую-то инфу из бд, хотят иметь вот такую фишку. Выдернул я им колонки как в бывшем экселе за пол года, а они дальше ковыряются. Бред конечно, но.... надо делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 15:49 |
|
Sybase ASE ODBC производительность
|
|||
---|---|---|---|
#18+
В принципе, диагноз ясен и понятен, все из-за множественного вызова SQLGetData(). Спасибо Nashville! Вопрос к "знатокам": А что, SQLBindCol() имеет какие-то ограничения или неудобства? Почему Microsoft пошла именно по пути SQLGetData(), в своем ADO.NET вместо SQLBindCol()??? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 17:13 |
|
Sybase ASE ODBC производительность
|
|||
---|---|---|---|
#18+
_develВ принципе, диагноз ясен и понятен, все из-за множественного вызова SQLGetData(). Спасибо Nashville! Вопрос к "знатокам": А что, SQLBindCol() имеет какие-то ограничения или неудобства? Почему Microsoft пошла именно по пути SQLGetData(), в своем ADO.NET вместо SQLBindCol()???У SQLBindCol нет возможности работать с длинными типами. Там сколько памяти дал под колонку - столько вытянуть и сможешь. А у SQLGetData() такой проблемы нет - там можно звать SQLGetData несколько раз подряд на одно и то-же поле одной и той-же строки и получать на каждом вызове очередной кусочек данных. Единственный метод для работы со всяческими long varchar, long binary, text, ntext и тд и тп. Ну и что-бы не усложнять ADO.Net интерфейс мелкомягкие решили пойти по наиболее универсальному, хоть и более медленному, пути. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 19:27 |
|
Sybase ASE ODBC производительность
|
|||
---|---|---|---|
#18+
White Owl, Понял, спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 19:50 |
|
Sybase ASE ODBC производительность
|
|||
---|---|---|---|
#18+
_devel, Можно попробовать вместо MS ADO.Net использовать другой провайдер ADO.Net -- DataDirect компании Progress Software. Компания делает wire-драйверы, которые к тому же настраиваются. http://www.datadirect.com/support/product-documentation/getting-started/datadirect-connect-for-ado-net Удачи ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 01:05 |
|
Sybase ASE ODBC производительность
|
|||
---|---|---|---|
#18+
_develMasterZiv_devel, А зачем же вам сто тысяч записей? Не сыпьте мне соль на рану MasterZiv. Так требует заказчик. Пошли его в жопу. Потом он тебя будет выспрашивать, как ему там что-то найти быстро, а потом ещё немного -- и эксель переполнится. Я серьёзно, без шуток. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 14:01 |
|
Sybase ASE ODBC производительность
|
|||
---|---|---|---|
#18+
Ещё можно просто делать выгрузку не самому, а через BPC. Или самому, но используя BCP API (сложнее, нужно не на С# писать наверное). Идея такая: создаёшь view с запросом на нужную выборку. Запускаешь BCP на выгрузку из этой view вместо таблицы. Потом view конечно удаляется. BCP может генерировать CSV, а оно легко засасывается Excel. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 14:10 |
|
Sybase ASE ODBC производительность
|
|||
---|---|---|---|
#18+
MasterZiv_develпропущено... Не сыпьте мне соль на рану MasterZiv. Так требует заказчик. Пошли его в жопу. Потом он тебя будет выспрашивать, как ему там что-то найти быстро, а потом ещё немного -- и эксель переполнится. Я серьёзно, без шуток. Это уже политические вопросы, а не технические! MasterZivЕщё можно просто делать выгрузку не самому, а через BPC. Или самому, но используя BCP API (сложнее, нужно не на С# писать наверное). Идея такая: создаёшь view с запросом на нужную выборку. Запускаешь BCP на выгрузку из этой view вместо таблицы. Потом view конечно удаляется. BCP может генерировать CSV, а оно легко засасывается Excel. Думаю слезим с ODBC на ADO.net провайдеры самого ASE. Те что Sybase сам сделал. Ну а мелкомягким "респект и уважуха" за такую "свинью" с SQLGetData() ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2013, 16:01 |
|
|
start [/forum/topic.php?fid=55&msg=38414869&tid=2009929]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
162ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 270ms |
0 / 0 |