2017-05-09 4 views
0

Ich brauche eine Abfrage für einen Überblick über den tatsächlichen Bestand (nur eine Zeile für jede eindeutige Produkt-ID) und alle Verkaufs- und Kaufaufträge. Im Moment verwenden wir zwei Unterabfragen (Verkaufs- und Kaufaufträge), da es mehrere Verkaufs- und Kaufaufträge geben kann. Diese Abfrage ist aufgrund der zwei Unterabfragen extrem langsam. Gibt es einen alternativen Weg, um die Summe der Kundenaufträge und die Summe der Bestellungen zu erhalten, zum Beispiel mit einem normalen Linksbeitritt?MySQL beschleunigen Unterabfrage mit Summe

Aktuelle Abfrage

SELECT stock.quanity, salesOrders.quantity, purchaseOrders.quantity 
FROM stock 
LEFT JOIN (
    SELECT product_id, sum(quantity) as quantity 
    FROM sales_orders 
    GROUP BY product_id 
) salesOrders ON stock.product_id=salesOrders.product_id 
LEFT JOIN (
    SELECT product_id, sum(quantity) as quantity 
    FROM purcahse_orders 
    GROUP BY product_id 
) purchaseOrders ON stock.product_id=purchaseOrders.product_id 
+0

Haben Sie Indizes für 'stock.product_ID' und' salesOrders.product_ID' und 'purchaseOrders.Product_ID'? – xQbert

+0

Ja, das Produkt ist Spalten haben Indizes. – Stefan

Antwort

2

Es ist möglich, dass korrelierte Unterabfragen schneller sein wird, mit der rechten Indizierung:

SELECT s.quantity, 
     (SELECT sum(so.quantity) FROM sales_orders so WHERE s.product_id = so.product_id 
     ) as sales_quantity , 
     (SELECT sum(po.quantity) FROM purchase_orders po WHERE s.product_id = po.product_id 
     ) as purchase_quantity 
FROM stock s ; 

Für diese jede Hoffnung zu haben, die Leistung zu verbessern, müssen Sie Indizes für sales_orders(product_id, quantity) und purchase_orders(product_id, quantity).

+0

Das sollte eine gute Idee sein, aber das gibt es ein Problem: Es sollte eine WAS-Aussage: po.quantity + stock.quantity Stefan

+0

Wow, ich dachte immer, diese Art von Abfragen wäre langsamer, da jede Auswahl einmal pro Datensatz auf Lager ausgeführt würde. Wenn der Bestand 1000 Datensätze aufwies, würden Sie 2001 Abfragen ausführen, im Gegensatz zu einem Join, der 3 Abfragen ausführt. Ich habe nie realisiert, dass der Join Overhead so viel wäre. Ich könnte es effizienter sehen, wenn der Bestand nur wenige Datensätze hätte oder der Bestand eine Untermenge des Ganzen wäre; aber wenn Vorrat 100er von Aufzeichnungen ist ... Ich denke, ich muss testen! – xQbert

+0

@xQbert. . . In MySQL können Aggregationen, die korrelierte Unterabfragen verwenden, schneller sein als die Verwendung von Joins, vorausgesetzt, Sie haben die richtigen Indizes. Die Erklärung ist zu lang für das Kommentarfeld. –