2016-09-20 3 views
0

Ich habe eine SQL-Abfrage, die meiner Meinung nach viel zu lange dauert, etwa 30 Sekunden, wie es jetzt aussieht. Ich habe zwei Tabellen, Record und Mainrecord. Ich möchte Informationen über alle Mainrecords erhalten, die 0 in der Spalte Menge haben, und auch in diesem Fall den neuesten Record mit der gleichen ID, die etwas anderes als 0 in seiner eigenen Menge hat. Ich habe ungefähr 30.000 Hauptbücher und ungefähr 3.000.000 Aufzeichnungen. Ich denke, dass dies in gewisser Weise optimiert werden kann, aber ich kann es nicht herausfinden.Inner Join zwischen Tabellen, zeitaufwendig

SELECT * 
FROM (
    mainrecord 
    INNER JOIN (
     SELECT tt.* 
     FROM record tt 
     INNER JOIN (
      SELECT Max(record.timestamp) AS maxtimestamp, id 
      FROM record 
      WHERE record.amount <> 0 
      GROUP BY record.id 
     ) AS rec 
     ON tt.id = rec.id AND tt.timestamp = rec.maxtimestamp 
    ) AS t 
    ON mainrecord.id = t.id 
) 
WHERE amount = 0 

ERKLÄREN:

+----+-------------+------------+-------------+---------------+-----------+---------+---------------------+---------+----------+---------------------------------------+ 
| id | select_type | table | type  | possible_keys | key | key_len |   ref   | rows | filtered |     Extra     | 
+----+-------------+------------+-------------+---------------+-----------+---------+---------------------+---------+----------+---------------------------------------+ 
| 1 | PRIMARY  | Mainrecord | index_merge | Id,Amount  | Amount |  768 | \N     | 2850 | 100,00 | Using sort_union(Amount); Using where | 
| 1 | PRIMARY  | <derived3> | ref   | key0   | key0  |  768 | db.Mainrecord.Id |  53 | 100,00 | Using where       | 
| 1 | PRIMARY  | tt   | ref   | Id,timestamp | timestamp |  9 | record.maxtimestamp |  1 | 100,00 | Using where       | 
| 3 | DERIVED  | Record  | index  | Amount  | Id  |  768 | \N     | 3185669 | 50,03 | Using where       | 
+----+-------------+------------+-------------+---------------+-----------+---------+---------------------+---------+----------+---------------------------------------+ 
+1

Haben Sie Indizes? Bitte fügen Sie der Frage auch 'Explain'-Ergebnisse hinzu. – Shaharyar

+0

Wer ist Hauptregister Tabelle? –

+0

@Shaharyar, sowohl id als auch amout sind Schlüssel in beiden Tabellen. – Nick3

Antwort

0

Was ist das? Zu extrahieren, die Gruppierung von Unterabfragen

AKTUALISIERT:

SELECT * 
FROM mainrecord mr 
    INNER JOIN (SELECT Max(record.timestamp) AS maxtimestamp, id 
     FROM record 
     WHERE record.amount <> 0 
     GROUP BY record.id) AS max_r ON max_r.id=mr.id 
    INNER JOIN record r ON mr.id = r.id 
WHERE mr.amount = 0 
    AND r.timestamp = max_r.maxtimestamp 
+0

Danke, aber ich bekomme das nicht zur Arbeit. Ich vermute, dass der 'FROM Record'' FROM record tt' sein sollte. Ich habe auch das ')' nach 'rec.maximimestamp' entfernt, da die Anzahl der Klammern nicht zusammenpasste. Der Fehler, den ich jetzt bekomme, ist Syntaxfehler an: 'AS max_r ON max_r.id = mr.id INNER JOIN-Datensatz r ON mr.id = r.id' – Nick3

+0

Ich kann Sytax nicht richtig überprüfen. Bitte erstellen SQlFiddle, so dass ich die Abfrage testen kann – StanislavL

+0

http://sqlfiddle.com/#!9/430e02/1/0 Test, fügte ich eine sehr einfache Struktur, die alle Elemente enthält, die wir verwenden. – Nick3