2017-03-14 7 views
0

Ich habe die folgende Abfrage, die eine Self-Join in der Tabelle Standorte ausführt. Wenn ich diese Abfrage für eine Million Datensätze ausführe, dauert die Ausführung mehr als 2 Stunden. Würde es wirklich schätzen, wenn eine Leistungsverbesserung bei dieser Abfrage durchgeführt werden kann, so dass die Ausführungszeit verbessert wird.Leistungsverbesserung in der Abfrage

SELECT 
    a.Id1, a.Id2, a.LocationStart, a.LocationEnd 
FROM 
    Locations AS a 
JOIN 
    Locations AS b 
ON 
    a.Id1= b.Id1 AND a.Id2 = b.Id2 
WHERE 
    a.DateTime = (
     SELECT 
      MIN(DateTime) 
     FROM 
      Locations 
     WHERE 
      Id1 = a.Id1 
      AND Id2 = a.Id2) 
+0

Huh, aber was versuchen Sie eigentlich hier zu lösen? Vielleicht hat das Problem eine andere Herangehensweise als die Abfrage auf 1e^18 Ergebnissen. – Pentium10

+0

Wofür brauchen Sie 'Locations AS b'? Es ist ungenutzt –

Antwort

1

Ich würde beobachten, dass Ihre Abfrage keinen Sinn ergibt. Ich nehme an, dass es zu stark vereinfacht ist, daher werde ich Spalten aus beiden Tabellenreferenzen hinzufügen.

würde ich mithilfe von Fensterfunktionen starten:

SELECT l.Id1, l.Id2, l2.id1, l2.id2, l.LocationStart, l.LocationEnd 
FROM (SELECT l.*, 
      ROW_NUMBER() OVER (PARTITION BY id1, id2 ORDER BY datetime ASC) as seqnum 
     FROM Locations l 
    ) l JOIN 
    Locations l2 
    ON l.Id1 = l2.Id1 AND l.Id2 = l2.Id2 AND l.seqnum = 1; 

Dies setzt voraus, dass Sie für einen einzigartigen Wert aus der ersten Tabelle suchen (das heißt, es gibt keine Datum Zeit Duplikate).

Als nächstes würde ich beobachten, dass Sie einfach den ersten Wert für die l1 Felder möchten. Erraten Sie, was? Sie benötigen keine join überhaupt.

select first_value(l.id1) over (partition by id1, id2 order by datetime), 
     first_value(l.id2) over (partition by id1, id2 order by datetime), 
     l.id1, 
     l.id2, 
     first_value(l.locationstart) over (partition by id1, id2 order by datetime), 
     first_value(l.locationend) over (partition by id1, id2 order by datetime)  
from locations l; 
Verwandte Themen