powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Sybase ASE ODBC производительность
14 сообщений из 14, страница 1 из 1
Sybase ASE ODBC производительность
    #38412783
_devel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,

Наше приложение написано на .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()?
...
Рейтинг: 0 / 0
Sybase ASE ODBC производительность
    #38412945
Nashville
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_devel,

Могу предположить, что в первом случае с GetData приложение ждет до конца получения всех данных, а в другом случае вначале отображает небольшое кол-во строк и уже потом в фоновом режиме "дочитывает" остальные данные, таким же образом работает и Interactive SQL.
...
Рейтинг: 0 / 0
Sybase ASE ODBC производительность
    #38413071
_devel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nashville,

Неа, в обоих случаях вызывается SQLFetch(). Так что вряд ли "ждет до конца получения всех данных".

С SQLBindCol()
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
    
    retcode = SQLBindCol(stmt, 4, SQL_C_WCHAR, aufName, sizeof(aufName), &aufNameLen);
    sqlok(stmt, retcode, (char*)"SQLBindCol failed");

    while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
        retcode = SQLFetch(stmt);
    }



С SQLGetData()
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    
    //retcode = SQLBindCol(stmt, 4, SQL_C_WCHAR, aufName, sizeof(aufName), &aufNameLen);
    //sqlok(stmt, retcode, (char*)"SQLBindCol failed");

    while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
        retcode = SQLFetch(stmt);
        SQLGetData(stmt, 4, SQL_C_WCHAR, aufName, sizeof(aufName), &aufNameLen);
    }
...
Рейтинг: 0 / 0
Sybase ASE ODBC производительность
    #38413150
Nashville
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
...
Рейтинг: 0 / 0
Sybase ASE ODBC производительность
    #38413183
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_devel,

А зачем же вам сто тысяч записей?
...
Рейтинг: 0 / 0
Sybase ASE ODBC производительность
    #38413248
_devel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv_devel,

А зачем же вам сто тысяч записей?

Не сыпьте мне соль на рану MasterZiv.
Так требует заказчик. Подозреваю что до нашей системы они работали с экселем, и чтоб каждый раз не просить IT-службу достать какую-то инфу из бд, хотят иметь вот такую фишку. Выдернул я им колонки как в бывшем экселе за пол года, а они дальше ковыряются. Бред конечно, но.... надо делать.
...
Рейтинг: 0 / 0
Sybase ASE ODBC производительность
    #38413387
_devel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе, диагноз ясен и понятен, все из-за множественного вызова SQLGetData().
Спасибо Nashville!

Вопрос к "знатокам": А что, SQLBindCol() имеет какие-то ограничения или неудобства? Почему Microsoft пошла именно по пути SQLGetData(), в своем ADO.NET вместо SQLBindCol()???
...
Рейтинг: 0 / 0
Sybase ASE ODBC производительность
    #38413528
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_develВ принципе, диагноз ясен и понятен, все из-за множественного вызова SQLGetData().
Спасибо Nashville!

Вопрос к "знатокам": А что, SQLBindCol() имеет какие-то ограничения или неудобства? Почему Microsoft пошла именно по пути SQLGetData(), в своем ADO.NET вместо SQLBindCol()???У SQLBindCol нет возможности работать с длинными типами. Там сколько памяти дал под колонку - столько вытянуть и сможешь.
А у SQLGetData() такой проблемы нет - там можно звать SQLGetData несколько раз подряд на одно и то-же поле одной и той-же строки и получать на каждом вызове очередной кусочек данных. Единственный метод для работы со всяческими long varchar, long binary, text, ntext и тд и тп.
Ну и что-бы не усложнять ADO.Net интерфейс мелкомягкие решили пойти по наиболее универсальному, хоть и более медленному, пути.
...
Рейтинг: 0 / 0
Sybase ASE ODBC производительность
    #38413552
_devel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

Понял, спасибо!
...
Рейтинг: 0 / 0
Sybase ASE ODBC производительность
    #38413748
lookat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_devel,

Можно попробовать вместо MS ADO.Net
использовать другой провайдер ADO.Net --
DataDirect компании Progress Software.
Компания делает wire-драйверы,
которые к тому же настраиваются.

http://www.datadirect.com/support/product-documentation/getting-started/datadirect-connect-for-ado-net

Удачи
...
Рейтинг: 0 / 0
Sybase ASE ODBC производительность
    #38414262
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_develMasterZiv_devel,

А зачем же вам сто тысяч записей?

Не сыпьте мне соль на рану MasterZiv.
Так требует заказчик.

Пошли его в жопу.
Потом он тебя будет выспрашивать, как ему там что-то найти быстро,
а потом ещё немного -- и эксель переполнится.

Я серьёзно, без шуток.
...
Рейтинг: 0 / 0
Sybase ASE ODBC производительность
    #38414278
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё можно просто делать выгрузку не самому, а через BPC.
Или самому, но используя BCP API (сложнее, нужно не на С# писать наверное).

Идея такая: создаёшь view с запросом на нужную выборку. Запускаешь BCP на выгрузку из этой view вместо таблицы.
Потом view конечно удаляется.

BCP может генерировать CSV, а оно легко засасывается Excel.
...
Рейтинг: 0 / 0
Sybase ASE ODBC производительность
    #38414519
_devel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv_develпропущено...


Не сыпьте мне соль на рану MasterZiv.
Так требует заказчик.

Пошли его в жопу.
Потом он тебя будет выспрашивать, как ему там что-то найти быстро,
а потом ещё немного -- и эксель переполнится.

Я серьёзно, без шуток.

Это уже политические вопросы, а не технические!

MasterZivЕщё можно просто делать выгрузку не самому, а через BPC.
Или самому, но используя BCP API (сложнее, нужно не на С# писать наверное).

Идея такая: создаёшь view с запросом на нужную выборку. Запускаешь BCP на выгрузку из этой view вместо таблицы.
Потом view конечно удаляется.

BCP может генерировать CSV, а оно легко засасывается Excel.

Думаю слезим с ODBC на ADO.net провайдеры самого ASE. Те что Sybase сам сделал.
Ну а мелкомягким "респект и уважуха" за такую "свинью" с SQLGetData()
...
Рейтинг: 0 / 0
Sybase ASE ODBC производительность
    #38414869
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_devel,

Это как раз технический вопрос.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Sybase ASE ODBC производительность
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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