Russian Qt Forum

Qt => Базы данных => Тема начата: smirnoff от Май 23, 2011, 08:06



Название: QODBC + MSSQ. Медленно работает
Отправлено: 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?


Название: Re: QODBC + MSSQ. Медленно работает
Отправлено: Disaron от Май 23, 2011, 08:17
Да, бо ODBC тормоз by design. Он не предназначен для нагруженных баз, только для поделок и тестов.


Название: Re: QODBC + MSSQ. Медленно работает
Отправлено: TukiNov от Май 23, 2011, 08:22
Низкая скорость может быть из-за включенной трассировки, смотрим odbcinst.ini
Код:
TraceFile=/tmp/odbctrace.log
Trace=Yes


Название: Re: QODBC + MSSQ. Медленно работает
Отправлено: LisandreL от Май 23, 2011, 08:24
Да, ODBC тормознут.
Кроме того, если у вас на каждый инсерт открывается и закрывается транзакция, то это тоже небыстрая вещь.
Для ускорения можно все инсерты производить в одной транзакции, но при этом надо понимать, что если неудастся один из инсертов, то откатятся все.


Название: Re: QODBC + MSSQ. Медленно работает
Отправлено: smirnoff от Май 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();
...

Как свести вся в одну транзакцию?


Название: Re: QODBC + MSSQ. Медленно работает
Отправлено: Пантер от Май 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 ();
 



Название: Re: QODBC + MSSQ. Медленно работает
Отправлено: smirnoff от Май 23, 2011, 20:17
Спасибо. Время работы сократилось в 4 раза. С 40 минут до 10 при 2,500,000 записей.


Название: Re: QODBC + MSSQ. Медленно работает
Отправлено: LisandreL от Май 24, 2011, 02:25
Попробуйте ещё execBatch, хотя и н уверен, что это даст прирост.
Ну и, конечно не все сразу значения в батч. Попробуйте по 10, 100, 1024...