Russian Qt Forum

Qt => Базы данных => Тема начата: Dastes от Апрель 16, 2012, 18:49



Название: sqlite и qt
Отправлено: Dastes от Апрель 16, 2012, 18:49
Вставка в таблицу 1361 записи занимает ~130 секунд.  Пробовал перебирать циклом и пакетным запросом.
Можно ли как-нибудь ускорить это дело?

Код:
void Transactions::putData(QStringList data, QString name)
{
    QSqlDatabase db = QSqlDatabase::addDatabase( "QSQLITE" );
    db.setDatabaseName( "data.db" );
    db.open();
    
    
    //   QSqlQuery qry;
    
    //   qry.prepare( "CREATE TABLE "+name+" (id INTEGER PRIMARY KEY AUTOINCREMENT, val VARCHAR(10))" );
    //   qry.exec();
    
    //   for(int i=0; i<data.size();++i)
    //   {
    //   QString val=data.at(i);
    //   qry.prepare( "INSERT INTO "+name+" (val) VALUES ('"+val+"')" );
    //   qry.exec();
    //   }
    
    
    
    
    QSqlQuery qry;
    
    qry.prepare( "CREATE TABLE "+name+" (id INTEGER PRIMARY KEY AUTOINCREMENT, val VARCHAR(10))" );
    qry.exec();

    qry.prepare( "INSERT INTO "+name+" (val) VALUES (?)" );

    QVariantList names;
    for(int i=0; i<data.size();++i) names.append(data.at(i));

    qry.addBindValue(names);
    qry.execBatch();
    
    db.close();
}


Название: Re: sqlite и qt
Отправлено: DmP от Апрель 16, 2012, 19:05
Может транзакция поможет?


Название: Re: sqlite и qt
Отправлено: Dastes от Апрель 16, 2012, 19:09
В справке по QSqlQuery о транзакциях ни слова не нашел.
Ты бы пример привел.


Название: Re: sqlite и qt
Отправлено: Dastes от Апрель 16, 2012, 19:24
Все. Вопрос решен.
Правда помогла транзакция. Заполняется таблица незаметно быстро. Оказывается это относится к  QSqlDatabase.


Название: Re: sqlite и qt
Отправлено: JayFOX от Апрель 16, 2012, 22:31
На MySQL прирост скорости значительный, если внести в один запрос вида
Код:
INSERT INTO table(val) VALUES(...), (...) ...


Название: Re: sqlite и qt
Отправлено: Пантер от Апрель 17, 2012, 09:46
Замечание, ты неверно используешь prepare. Почитай в ассистенте, как правильно нужно.


Название: Re: sqlite и qt
Отправлено: UNION labs от Апрель 18, 2012, 11:50
Транзакция решает!

Код:
void Transactions::putData(QStringList data, QString name)
{
    QSqlDatabase db = QSqlDatabase::addDatabase( "QSQLITE" );
    db.setDatabaseName( "data.db" );
    db.open();

    db.transaction();
    // вставка сколько угодно строк
    db.commit();
    
    db.close();
}

Вот нашел даже такое сравнение скорости http://www.sqlite.org/speed.html (http://www.sqlite.org/speed.html)


Название: Re: sqlite и qt
Отправлено: Dastes от Апрель 18, 2012, 11:56
Транзакция решает!

Код:
void Transactions::putData(QStringList data, QString name)
{
    QSqlDatabase db = QSqlDatabase::addDatabase( "QSQLITE" );
    db.setDatabaseName( "data.db" );
    db.open();

    db.transaction();
    // вставка сколько угодно строк
    db.commit();
    
    db.close();
}

Вот нашел даже такое сравнение скорости http://www.sqlite.org/speed.html (http://www.sqlite.org/speed.html)
Так и сделал!
Только не пойму почему пакетный запрос не канает. Судя по логике он должен все за один раз туда отправить, а на практике выполняется так же долго как и простыми запросами через цикл.


Название: Re: sqlite и qt
Отправлено: UNION labs от Апрель 18, 2012, 12:06
Только не пойму почему пакетный запрос не канает. Судя по логике он должен все за один раз туда отправить, а на практике выполняется так же долго как и простыми запросами через цикл.

Что вы подразумеваете под пакетным запросом?


Название: Re: sqlite и qt
Отправлено: Dastes от Апрель 18, 2012, 12:10
Только не пойму почему пакетный запрос не канает. Судя по логике он должен все за один раз туда отправить, а на практике выполняется так же долго как и простыми запросами через цикл.

Что вы подразумеваете под пакетным запросом?

http://qt-project.org/doc/qt-4.8/qsqlquery.html#execBatch (http://qt-project.org/doc/qt-4.8/qsqlquery.html#execBatch)


Название: Re: sqlite и qt
Отправлено: UNION labs от Апрель 18, 2012, 12:20
Ага понял, не внимательно прочитал ваш первый пост.

На самом деле все просто

Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
QSqlDriver * driver = db.driver();
qDebug() << driver->hasFeature( QSqlDriver::BatchOperations ); // false

SQLite просто не поддерживает данной возможности!


Название: Re: sqlite и qt
Отправлено: Dastes от Апрель 21, 2012, 22:13
Возникла еще проблема:
Установил чистый xp на виртуальную машину.
Скопировал туда программу.
Она запускается нормально, но список QComboBox, который заполняется данными из запроса к Sqlite, пуст. Никаких ошибок не выдает.

В чем может быть дело?


Название: Re: sqlite и qt
Отправлено: LisandreL от Апрель 22, 2012, 00:10
dll не взяли, а ошибки нет, потому, что при открытии и запросах не проверяете успешность этих операций и не выводите ошибку при неудаче.


Название: Re: sqlite и qt
Отправлено: Dastes от Апрель 22, 2012, 00:21
LisandreL,  так и есть :)
Думал,что QtSql4.dll достаточно.
Нужно в папке с программой создать папку sqldrivers, и закинуть туда qsqlite4.dll.