Sqlite 获取QSqlQuery结果的速度非常慢

Sqlite 获取QSqlQuery结果的速度非常慢,sqlite,qt,Sqlite,Qt,我在Qt中看到了sqlite数据库中令人费解的缓慢行为。下面代码中的查询在同一数据库上从sqlite命令行实用程序执行时,会立即完成 qDebug() << "Beginning" << QDateTime::currentDateTime ().toString(Qt::ISODate); QSqlQuery q(QSqlDatabase::database(mFilename)); q.prepare( "select TextFormIndex.Id from Te

我在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";
不知怎的,第三个电话花了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 );
形态学分析成员.AllomorphId对应于AllomorphId.\u id.TextFormIndex.id对应于形态学分析成员.TextFormId

形态学分析成员有4082行 TextFormIndex有17710行
Allomorph有1660行

您的Qt中使用的SQLite版本似乎太旧了


更新到最新的Qt,或者。

这三个表的结构是什么?每个有多少条记录,返回了多少条记录?我编辑了这个问题以添加这些信息。您在命令行和程序中使用的是相同的SQLite版本吗?Qt有3.6.19。我的命令行版本是3.7.13。我面临着类似的问题。您能否解释一下“使用的SQLite版本太旧了”,或者这只是一个建议/猜测?我对Qt5.2.1有问题,它可能也有非常新的SQLite。@hyde Use
SELECT SQLite_version()
比较Qt和命令行shell使用的版本。感谢您的提示,以备将来使用。我的问题是因为缺少索引,现在解决了。
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 );