具有数百万行的四个表之间的连接的SQL查询

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.但在测试中它似乎没有加速.

为了加快速度,你会如何处理?

Qua*_*noi 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
Run Code Online (Sandbox Code Playgroud)