我对QSqlQuery和GROUP BY有问题。我的数据库是inMemory,它是这样创建的:
query.exec("create table if not exists ProzSchnitte (id integer primary key autoincrement, Kanal uint, ProgNr uint, WkzNr uint, WkzBez blob, BearbNr uint, "
"Offset uint, Datum uint, Uhrzeit uint, count uint, SchnittHeader blob, xVals blob, yVals blob, Strom1 blob, Strom2 blob, Strom3 blob)");然后,我将数据写入到这个表中,如下所示:
query.prepare(QString("INSERT INTO ProzSchnitte (Kanal, ProgNr, WkzNr, WkzBez, BearbNr, Offset, Datum, Uhrzeit, Count, SchnittHeader, xVals, yVals, Strom1, Strom2, Strom3) VALUES (%1, %2, %3, ?, %4, %5, %6,%7, %8, ?, ?, ?, ?, ?, ?) ")
.arg(TempSchnitt.Header.Kanal).arg(TempSchnitt.Header.Programmnummer).arg(TempSchnitt.Header.Werkzeugnummer)
.arg(TempSchnitt.Header.Bearbeitungsnummer).arg(TempSchnitt.Header.Offset).arg(TempSchnitt.Header.Datum)
.arg(TempSchnitt.Header.Uhrzeit).arg(impCount));
query.bindValue(1,HeaderArray);
query.bindValue(2,x);
query.bindValue(3,y);
query.bindValue(4,Strom1);
query.bindValue(5,Strom2);
query.bindValue(6,Strom3);
query.exec();
query.finish();在那之后,我像这样读取数据:
QSqlQuery q(QSqlDatabase::database("ProzAnaDB"));
q.prepare("select * from ProzSchnitte GROUP BY Kanal, ProgNr, Offset, WkzNr, BearbNr, Count order by Count, Kanal, ProgNr, Offset, BearbNr");
q.exec();这段代码的执行速度非常慢,大约需要8秒,但是如果我不使用GROUP BY进行select操作,那么它的执行时间不到10毫秒。
我读到我可能不得不在我的表中设置so索引,但我不知道这意味着什么,也不知道我如何做到这一点。
我对我的问题进行了解释,结果是这样的。
QSqlRecord( 8 )
" 0:" QSqlField("addr", int, generated: yes, typeID: 1) "0"
" 1:" QSqlField("opcode", QString, generated: yes, typeID: 3) ""
" 2:" QSqlField("p1", int, generated: yes, typeID: 1) "0"
" 3:" QSqlField("p2", int, generated: yes, typeID: 1) "0"
" 4:" QSqlField("p3", int, generated: yes, typeID: 1) "0"
" 5:" QSqlField("p4", QString, generated: yes, typeID: 3) ""
" 6:" QSqlField("p5", QString, generated: yes, typeID: 3) ""
" 7:" QSqlField("comment", , generated: yes, typeID: 5) "" 谁能给我解释一下我可以做些什么来提高这个查询的性能?
发布于 2015-09-10 01:17:50
分析查询的正确命令不是EXPLAIN而是EXPLAIN QUERY PLAN,您应该在命令行shell或其他数据库工具中执行此操作,以便更容易地查看结果。
无论如何,此查询最有用的索引是同时匹配ORDER BY和GROUP BY的索引(因此对GROUP BY列进行重新排序):
CREATE INDEX whatever ON ProzSchnitte(Count, Kanal, ProgNr, Offset, BearbNr);https://stackoverflow.com/questions/32483940
复制相似问题