2009-04-07 8 views
1

Wir haben eine Transact-SQL-Anweisung, die 4 Tabellen mit Millionen von Zeilen abfragt.Sql-Abfrage mit Joins zwischen vier Tabellen mit Millionen von Zeilen

Es dauert einige Minuten, obwohl es laut TuningAdvisor mit Indizes und Statistiken optimiert wurde.

Die Struktur der Abfrage ist wie:

 
SELECT E.EmployeeName 
    , SUM(M.Amount) AS TotalAmount 
    , SUM(B.Amount) AS BudgetAmount 
    , SUM(T.Hours) AS TotalHours 
    , SUM(TB.Hours) AS BudgetHours 
    , SUM(CASE WHEN T.Type = 'Waste' THEN T.Hours ELSE 0 END) AS WastedHours 
FROM Employees E 
LEFT JOIN MoneyTransactions M 
    ON E.EmployeeID = M.EmployeeID 
LEFT JOIN BudgetTransactions B 
    ON E.EmployeeID = B.EmployeeID 
LEFT JOIN TimeTransactions T 
    ON E.EmployeeID = T.EmployeeID 
LEFT JOIN TimeBudgetTransactions TB 
    ON E.EmployeeID = TB.EmployeeID 
GROUP BY E.EmployeeName 

Da jede Transaktionstabelle Millionen von Zeilen enthält, halte ich es für Aufspalten pro Transaktion Tabelle in einer Abfrage auf, Tabellenvariablen wie @real verwenden, @budget und @hours und dann beitreten diese in einem endgültigen SELECT. Aber in Tests scheint es nicht zu beschleunigen.

Wie würden Sie damit umgehen, um es zu beschleunigen?

Antwort

8

Ich bin nicht sicher, dass die von Ihnen gepostete Abfrage die erwarteten Ergebnisse liefert.

Es kreuzt alle Dimensionstabellen (MoneyTransactions usw.) und multipliziert alle Ergebnisse.

Try this:

SELECT E.EmployeeName, 
     (
     SELECT SUM(amount) 
     FROM MoneyTransactions m 
     WHERE M.EmployeeID = E.EmployeeID 
     ) AS TotalAmount, 
     (
     SELECT SUM(amount) 
     FROM BudgetTransactions m 
     WHERE M.EmployeeID = E.EmployeeID 
     ) AS BudgetAmount, 
     (
     SELECT SUM(hours) 
     FROM TimeTransactions m 
     WHERE M.EmployeeID = E.EmployeeID 
     ) AS TotalHours, 
     (
     SELECT SUM(hours) 
     FROM TimeBudgetTransactions m 
     WHERE M.EmployeeID = E.EmployeeID 
     ) AS BudgetHours 
FROM Employees E 
+0

Hmmm ... Ist das nicht SELECT EmployeeID, EmployeeName, SUM (...), SUM (...) FROM Mitarbeiter GROUP BY EmployeeID, EmployeeName? – Tomalak

+0

Warum Gruppe auf Primärschlüssel? – Quassnoi

+0

Das ist ein Fehler (schlampiges Lesen). Macht nichts, mein Schlechter. +1 – Tomalak

1

Ich weiß nicht, ob Sie alle Indizes auf Tabellen haben, die Dinge beschleunigen, aber große Tische mit auf einer Abfrage Zeit, um diese Auswirkungen haben könnte. Ich würde empfehlen, die Tabellen wenn möglich zu partitionieren. Es ist mehr Arbeit, aber alles, was Sie tun, um die Abfrage zu beschleunigen, wird nach einigen Millionen neuen Datensätzen nicht ausreichen.