Ole*_*nge 1 sql sql-server join large-data-volumes
我们有一个transact sql语句,用于查询4个表,每个表中包含数百万行.
它需要几分钟,即使它已根据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.但在测试中它似乎没有加速.
为了加快速度,你会如何处理?
我不确定您发布的查询是否会产生您期望的结果.
它将交叉连接所有维度表(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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2173 次 |
| 最近记录: |