2016-09-02 5 views
0

Tabelle Mitarbeiter:Abfrageoptimierung für ungleiche Datenverbindung

Empid STW --StartWorkTime 
------------------------------ 
1  02:00:00.000 
2  03:00:00.000 
3  05:30:00.000 

Tabelle Order:

Orderid PlaceTime 
------------------------------- 
1  02:22:22.333 
2  02:33:33:555 
3  03:44:44:111 
4  05:45:45:545 

Anfrage wird: Schließen Sie die Aufträge an die Mitarbeiter durch ihre zeitliche Beziehung gesetzt, wie.:

Empid Orderid 
-------------------- 
1  1 
1  2 
2  3 
3  4 

Nehmen Sie den letzten Mitarbeiter aus der Arbeitszeit = aktuellen auf Arbeitszeit.

Derzeit meine Lösung ist:

SELECT e.empid, o.orderid 
FROM order o 
CROSS APPLY 
    (SELECT TOP(1) e.empid FROM order e 
     WHERE e.STW < o.placetime 
     ORDER BY STW DESC) e 

Die Lösung funktioniert gut, wenn Tabelle employee klein ist (order 1 mil Reihen, employee 50rows, seine etwa 30 sec), aber die Leistung sinkt schnell wie employee erweitert (wenn es 10000s Reihe, dauert es über eine Stunde). Gibt es Lösungen, um einen solchen Fall zu optimieren?

+0

Ich würde Ihnen empfehlen, einfach einen FK auf Bestellung hinzufügen, welcher Mitarbeiter hat es platziert (oder eine Verbindungstabelle) und dann einfach diese Informationen zu pflegen - wird auf lange Sicht viel einfacher sein. –

Antwort

0

Ich würde zuerst Indizes empfehlen. Zuerst würde ich die Abfrage beheben, so dass die Unterabfrage der employee-Tabelle verwendet (ich nehme an, das ein Tippfehler in der Frage ist):

SELECT e.empid, o.orderid 
FROM order o CROSS APPLY 
    (SELECT TOP(1) e.empid 
     FROM employee e 
     WHERE e.STW < o.placetime 
     ORDER BY STW DESC 
    ) e; 

Sie wollen einen Index für employee(STW, empid). Sehen Sie, ob das der Abfrage hilft.