2015-09-09 2 views
0

У меня проблема с QSqlQuery и GROUP BY. Моя база данных InMemory и создается следующим образом:QSqlQuery GroupBy Slow

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

Может кто-нибудь объяснить мне, что я могу сделать, чтобы повысить производительность этого запроса?

+0

вам действительно нужно сгруппировать по 10 столбцов ли? –

+0

да, мне это нужно, но это не имеет значения, сколько столбцов я группирую. Всего лишь 1 так же медленно, как и с 10 – solove

ответ

1

Правильная команда для анализа запроса - это не EXPLAIN, а EXPLAIN QUERY PLAN, и вы должны сделать это в командной строке или другом инструменте базы данных, чтобы вы могли легче просмотреть результат.

Во всяком случае, самый полезный индекс для этого запроса является один, который соответствует как ORDER BY и GROUP BY (так изменить порядок столбцов GROUP BY):

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

Спасибо. Отлично. Пошел от 8 секунд на запрос до 10 миллисекунд – solove

Смежные вопросы