【问题标题】:QSqlQuery GroupBy SlowQSqlQuery GroupBy 慢
【发布时间】:2015-09-09 15:42:47
【问题描述】:

我对 QSqlQuery 和 GROUP BY 有疑问。 我的数据库在内存中,是这样创建的:

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 的情况下进行选择,它会在 10 毫秒内执行。

我已经读到我可能必须在我的表中设置索引,但我不知道这意味着什么或我该怎么做。

我对我的查询进行了解释,这就是结果。

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) "" 

谁能解释一下我可以做些什么来提高这个查询的性能?

【问题讨论】:

  • 你真的需要按 10 列分组吗?
  • 是的,我确实需要它,但我分组多少列并不重要。只有 1 和 10 一样慢

标签: qt sqlite group-by qsqlquery


【解决方案1】:

分析查询的正确命令不是 EXPLAIN 而是 EXPLAIN QUERY PLAN,您应该在命令行 shell 或其他数据库工具中执行此操作,以便更轻松地查看结果。

无论如何,这个查询最有用的索引是同时匹配 ORDER BY 和 GROUP BY 的索引(所以重新排序 GROUP BY 列):

CREATE INDEX whatever ON ProzSchnitte(Count, Kanal, ProgNr, Offset, BearbNr);

【讨论】:

  • 谢谢。工作得很好。从每次查询 8 秒缩短到 10 毫秒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多