2009-04-07 3 views
1

У нас есть транзакционная инструкция sql, которая запрашивает 4 таблицы с миллионами строк в каждом.Запрос Sql с объединениями между четырьмя таблицами с миллионами строк

Это займет несколько минут, хотя оно оптимизировано с индексами и статистикой в ​​соответствии с TuningAdvisor.

Структура запроса, как:

 
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 

Поскольку каждая таблица транзакций содержит миллионы строк, я рассмотреть возможность разделения его на один запрос в таблицу транзакций, используя таблицу переменных, как @real, @budget и @hours , а затем присоединение к ним в окончательном SELECT. Но в тестах он, кажется, не ускоряется.

Как вы справитесь с этим, чтобы ускорить его?

ответ

8

Я не уверен, что запрос, который вы отправили, даст ожидаемые результаты.

Он пересечет все таблицы размеров (MoneyTransactions и т. Д.) И умножит все результаты.

Попробуйте это:

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

Хммм ... Разве это не SELECT EmployeeID, EmployeeName, SUM (...), SUM (...) FROM Employees GROUP BY EmployeeID, EmployeeName? – Tomalak

+0

Почему группа на первичном ключе? – Quassnoi

+0

Это ошибка (небрежное чтение). Ничего, мой плохой. +1 – Tomalak

1

Я не знаю, если у вас есть все индексы таблиц, которые будут ускорить вещи, но имеющие большие таблицы может иметь это влияние на время выполнения запроса. Я бы рекомендовал разбивать таблицы, если это возможно. Это больше работает, но все, что вы делаете, чтобы ускорить запрос, теперь не будет достаточно после нескольких миллионов новых записей.