Optimalisieren Sie die SQL-Abfrage mit der linken äußeren Verknüpfung und der Vereinigung

Ich habe eine ziemlich langsame Abfrage und ich möchte es schneller machen – ist es möglich?

SELECT k.Date, Levels, Used_id, Z_id, D_id, k.Client_id, f.Product_id FROM (SELECT Date, Levels, Used_id, Z_id, D_id, Client_id FROM Client_Data GROUP BY Date, Levels, Used_id, Z_id, D_id, Client_id) k LEFT OUTER JOIN (SELECT Date, Client, Product FROM Client_and_Product_Data GROUP BY Date, Client_id, Product) f on f.Date = k.Date and f.Client = k.Client_id union SELECT p.Date, Levels, Used_id, Z_id, D_id, f.Client_id, p.Product_id FROM (SELECT Date, Levels, Used_id, Z_id, D_id, Product_id FROM Product_Data GROUP BY Date, Levels, Used_id, Z_id, D_id, Product_id) p LEFT outer join (SELECT Date, Client, Product FROM Client_and_Product_Data GROUP BY Date, Client, Product) f on f.Date = p.Date and f.Product = p.Product_id; 

Es gibt 9mln datasätze in Client_data Tabelle, 300k datasätze in Product_data Tabelle und 250k datasätze in Client_and_Product_Data Tabelle.

Die ganze Abfrage dauert 3-4 Minuten.

Was ich in dieser Abfrage Client_and_Product_Data : In der Tabelle Client_and_Product_Data ich Verbindungen zwischen Client und Product . Ich möchte so etwas wie das kartesische Produkt von Client und Product , aber ich muss auch Spalten von Client und Product .

Spaltenarten:
Datesmalldatetime ,
Levelsvarchar ,
Used_idint ,
Z_id , D_id , Client_id , Product_iduniqueidentifier .

Sie Abfrage kann wahrscheinlich profitieren von Indizes. Ich würde empfehlen:

  • Client_Data(Date, Levels, Used_id, Z_id, D_id, Client_id)
  • Client_and_Product_Data(Date, Client, Product)
  • Product_Data(Date, Levels, Used_id, Z_id, D_id, Product_id)

Wenn Sie keine Duplikate beseitigen müssen, dann entfernen Sie die GROUP BY s in den Unterabfragen. Wenn es keine Duplikate zwischen den beiden Abfragen gibt, dann wechseln Sie UNION zu UNION ALL .