2

Qtのsqliteデータベースからの不可解な遅い動作が見られます。以下のコードのクエリは、同じデータベースのsqliteコマンドラインユーティリティから実行すると、瞬時に完了します。

qDebug() << "Beginning" << QDateTime::currentDateTime ().toString(Qt::ISODate);
QSqlQuery q(QSqlDatabase::database(mFilename));
q.prepare( "select TextFormIndex.Id from TextFormIndex,MorphologicalAnalysisMembers,Allomorph on TextFormId=Id and AllomorphId=Allomorph._id where LexicalEntryId=:Id;" );
q.bindValue(":Id", id);

QSet<qlonglong> textFormIds;
if( !q.exec()  )
{
    qWarning() << "DatabaseAdapter::lexicalEntryTextForms" << q.lastError().text() << q.executedQuery();
    return textFormIds;
}

qDebug() << "Before while" << QDateTime::currentDateTime ().toString(Qt::ISODate);
int nResults = 0;
while( q.next() )
{
    qDebug() << nResults++ << QDateTime::currentDateTime().toString(Qt::ISODate);
    q.value(0).toLongLong();
}
qDebug() << "After while";

このコードからのデバッグ出力は次のとおりです。

Beginning "2013-02-04T20:31:24" 
Before while "2013-02-04T20:31:26" 
0 "2013-02-04T20:31:26" 
1 "2013-02-04T20:31:27" 
2 "2013-02-04T20:31:41" 
3 "2013-02-04T20:31:44" 
After while 

どういうわけか、3番目の呼び出しは14秒かかります。

これは、適切なサイズのプロジェクトでの単一の方法です。これまで、私のクエリはどれもゆっくりと実行されていませんでした。

create table if not exists TextFormIndex ( TextName text, LineNumber integer, Id integer );
create table if not exists MorphologicalAnalysisMembers ( _id integer primary key autoincrement, TextFormId integer, AllomorphId integer, AllomorphOrder integer );
create table if not exists Allomorph ( _id integer primary key autoincrement, LexicalEntryId integer, WritingSystem integer, Form text );

MorphologicalAnalysisMembers.AllomorphIdは、Allomorph._idに対応します。TextFormIndex.Idは、MorphologicalAnalysisMembers.TextFormIdに対応します。

MorphologicalAnalysisMembersには4082行ありTextFormIndexには17710行ありますAllomorphには1660行あります

4

1 に答える 1

0

Qt で使用されている SQLite のバージョンが古すぎるようです。

最新の Qt に更新するか、新しい SQLite で Qt を再コンパイルします。

于 2013-02-07T16:02:18.840 に答える