2017-05-03 1 views
0

Ich habe Daten aus 3 verschiedenen Tabellen und ich muss einige bedingte Auswahl zwischen ihnen. DB Abfrage ist wie folgt:MySQL multi Tabelle beitreten

SELECT proddb.onrrnr, 
     proddb.onr     AS tellimus, 
     proddb.idnr    AS ID, 
     proddb.prod    AS toode, 
     proddb.proddate, 
     CASE 
     WHEN pf_prodQtySeq.glLiteNr = 1 THEN pf_ordRowSeq.gl1 
     WHEN pf_prodQtySeq.glLiteNr = 2 THEN pf_ordRowSeq.gl2 
     WHEN pf_prodQtySeq.glLiteNr = 3 THEN pf_ordRowSeq.gl3 
     WHEN pf_prodQtySeq.glLiteNr = 4 THEN pf_ordRowSeq.gl4 
     END      AS klaas, 
     Sum(pf_prodQtySeq.planQty) AS kogus  
FROM proddb 
     JOIN pf_prodQtySeq 
     ON proddb.onrrnr = pf_prodQtySeq.onrrnr 
     JOIN pf_ordRowSeq 
     ON proddb.onrrnr = pf_ordRowSeq.onrrnr 
WHERE pf_prodQtySeq.prLineSh = 'HEG' 
     AND pf_prodQtySeq.planQty > 0 
GROUP BY proddb.idnr 
ORDER BY klaas DESC LIMIT 1000,25; 

EDIT: dort in Code, wo auch ORDER und LIMIT-Klauseln, LIMIT ist dies die bis zu 10 Sekunden nach unten Abfrageausführungsgeschwindigkeit dreht, ohne LIMIT Abfrage über weniger als 1 sec dauert. Wie optimiert man LIMIT?

Diese Abfrage funktioniert OK, aber es dauert zu viel Zeit, um auszuführen. Diese Abfrage dauert ungefähr 5 Sekunden, obwohl jede Tabelle nur aus weniger als 50 000 Zeilen besteht. Versucht auch zweimal schneller und mit mehr RAM-Server; auch gleich mal. Tabellen sind indiziert. Gibt es etwas mit Abfrage zu tun, um es zu beschleunigen, oder ich muss Tabellen konsolidieren. Dies bedeutet, dass alle Daten in einer Tabelle liegen.

ERKLÄREN Ergebnis: enter image description here

+1

'Diese Abfrage funktioniert OK' ... nicht wirklich, weil Sie nicht aggregierte Spalten auswählen, während Sie' GROUP BY' verwenden. Vielleicht fügen Sie eine Beschreibung hinzu, was die Abfrage machen soll. –

+0

Statt 'Join' können Sie' Inner Join' versuchen. –

+0

Verwenden Sie 'EXPLAIN', um die Möglichkeiten zur Verbesserung der Abfrageleistung zu ermitteln. Sie können auch 'EXPLAIN' Ergebnis in Ihrer Frage zeigen. – Alexander

Antwort

0

Es sieht aus wie Ihre mehrere Indizes haben jeweils für eine Spalte auf der gleichen Tabelle (pf_prodQtySeq).

Sie sollten einen kombinierten Index hinzufügen, damit beide Teile Ihrer where-Klausel von einem Index profitieren können. Es kann nur ein Index für eine Tabelle verwendet werden, daher müssen Sie beide Spalten im selben Index haben, um eine bessere Leistung zu erzielen.

alter table pf_prodQtySeq add index prLineSh_planQty (prLineSh, planQty); 
0

Ihre Abfrage ausgeführt wird, ist gut. Aber Verwenden von filesort und Verwenden Sie temporäre wird empfohlen, auszuschließen. Die WHERE Klausel enthält Verweis auf pf_prodQtySeq Tabelle. Try zwingt den Optimierer, dieser Tabelle in der ersten Reihenfolge beizutreten, um die Anzahl der MySQL-Zusatzdurchläufe zu reduzieren (siehe STRAIGHT_JOIN Modifizierer für SELECT statement oder STRAIGHT_JOIN in table_references clause). Um Leistungseinbußen zu vermeiden, überwachen Sie die Änderungen mit EXPLAIN. Siehe auch Optimizing SELECT Statements für weitere Informationen. Viel Glück!