Russian Qt Forum
Ноябрь 24, 2024, 06:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QODBC + MSSQ. Медленно работает  (Прочитано 4340 раз)
smirnoff
Гость
« : Май 23, 2011, 08:06 »

Подскажите почему медленно работает выполнение транзакций в связке QT + QODBC + MSSQL?
Подключение происходит так:
Код:
QSqlDatabase db = QSqlDatabase::addDatabase( "QODBC3" );
db.setDatabaseName( "Driver={SQL Native Client};Server=my_comp_name;Database=db_name;Trusted_Connection=yes;" );

В цикле организуется добавление записей (INSERT). Цикл порядка 400.000 итераций и более.
В среднем за секунду добавляется ~1000 записей.

Как ускорить процесс? В этом виноват ODBC?
Записан
Disaron
Гость
« Ответ #1 : Май 23, 2011, 08:17 »

Да, бо ODBC тормоз by design. Он не предназначен для нагруженных баз, только для поделок и тестов.
Записан
TukiNov
Гость
« Ответ #2 : Май 23, 2011, 08:22 »

Низкая скорость может быть из-за включенной трассировки, смотрим odbcinst.ini
Код:
TraceFile=/tmp/odbctrace.log
Trace=Yes
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Май 23, 2011, 08:24 »

Да, ODBC тормознут.
Кроме того, если у вас на каждый инсерт открывается и закрывается транзакция, то это тоже небыстрая вещь.
Для ускорения можно все инсерты производить в одной транзакции, но при этом надо понимать, что если неудастся один из инсертов, то откатятся все.
Записан
smirnoff
Гость
« Ответ #4 : Май 23, 2011, 18:51 »

Инсерты происходят так:
Код:
for(int i = 0; i < (file.size() / 128); i++)
           {
               in.readRawData(kod, 17);
               in.readRawData(kod2, 17);
               in.readRawData(data, 11);
               in.readRawData(mars, 53);
               in.readRawData(data2, 30);

               query.prepare("INSERT INTO MR_FILE (kod, kod2, data, mars, data2)" "VALUES(:kod, :kod2, :data, :mars, :data2);");

               query.bindValue(":kod", QString(kod).left(17));
               query.bindValue(":kod2", QString(kod2).left(17));
               query.bindValue(":data", QString(data).left(11));
               query.bindValue(":mars", QString(mars).left(53));
               query.bindValue(":data2", QString(data2).left(30));

               query.exec();
...

Как свести вся в одну транзакцию?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Май 23, 2011, 19:31 »

Код
C++ (Qt)
QSqlDatabase::database ().transaction ();
query.prepare("INSERT INTO MR_FILE (kod, kod2, data, mars, data2)" "VALUES(:kod, :kod2, :data, :mars, :data2);");
for(int i = 0; i < (file.size() / 128); i++)
          {
              in.readRawData(kod, 17);
              in.readRawData(kod2, 17);
              in.readRawData(data, 11);
              in.readRawData(mars, 53);
              in.readRawData(data2, 30);
 
              query.bindValue(":kod", QString(kod).left(17));
              query.bindValue(":kod2", QString(kod2).left(17));
              query.bindValue(":data", QString(data).left(11));
              query.bindValue(":mars", QString(mars).left(53));
              query.bindValue(":data2", QString(data2).left(30));
 
              query.exec();
          }
QSqlDatabase::database ().commit ();
 

Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
smirnoff
Гость
« Ответ #6 : Май 23, 2011, 20:17 »

Спасибо. Время работы сократилось в 4 раза. С 40 минут до 10 при 2,500,000 записей.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #7 : Май 24, 2011, 02:25 »

Попробуйте ещё execBatch, хотя и н уверен, что это даст прирост.
Ну и, конечно не все сразу значения в батч. Попробуйте по 10, 100, 1024...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.089 секунд. Запросов: 23.