相关SQL Server查询的性能问题

时间:2016-07-29 06:37:46

标签: sql sql-server performance subquery correlated-subquery

我有一个如下所示的查询,它只是完全太慢而且我不知道如何加快速度。此查询目前是相关的。那么临时表会加入解决这个问题吗?

SELECT 
    e.ID, e.Name
FROM
    Employees e
WHERE
    e.Salary > (SELECT AVG(e2.Salary)
                FROM Employees e2
                WHERE e2.DepartmentID = e.DepartmentID)

5 个答案:

答案 0 :(得分:3)

请尝试以下SQL查询

with cte as (
select
    *,
    AVG(Salary) over (partition by DepartmentID) average
from employees
)
select * from cte where Salary > average

在这里,您将看到我使用了SQL Average aggregation function with Partition By子句 为了使用它,我更喜欢SQL CTE表达式

答案 1 :(得分:0)

我会尝试将子查询移动到连接中。如果DepartmentID上有一个包含工资列的索引,那么它将快速生成子查询结果并将其加入主结果。

SELECT e.ID, 
       e.Name
FROM Employees e
INNER JOIN (
    SELECT DepartmentID, AVG(Salary) as AverageSalary
    FROM Employees
    GROUP BY DepartmentId
) dptAvg ON e.DepartmentID = dptAvg.DepartmentId
WHERE
    e.Salary > dptAvg.AverageSalary

答案 2 :(得分:0)

它不仅仅是选择,想到用例。您需要在添加或更新员工薪水时计算平均工资,但您可能更频繁地需要此查询。每次阅读都无法重新计算。

我会将第二个查询分开,将结果存储在名为Departments的字段中的AvgSalary表中(我假设你有一个),然后让查询看起来像: / p>

SELECT
    e.ID,
    e.Name
FROM
    Employees e
    JOIN Departments d ON e.DepartmentID = d.DepartmentID
WHERE
    e.Salary > d.AvgSalary

答案 3 :(得分:0)

首先,我建议您尝试CROSS APPLY here了解更多信息:

SELECT  e.ID, 
        e.Name
FROM Employees e
CROSS APPLY (
    SELECT AVG(e2.Salary) as avgs
    FROM Employees e2
    WHERE e2.DepartmentID = e.DepartmentID
    ) as p
WHERE e.Salary > avgs

如果您使用的是SQL Server 2012及更高版本,则可以将CTE与AVG OVER

一起使用
;WITH cte AS (
SELECT  e.ID, 
        e.Name,
        AVG(e.Salary) OVER (PARTITION BY e.DepartmentID ORDER BY e.ID) as avgs,
        e.Salary
FROM Employees e
)

SELECT  ID,
        Name
FROM cte 
WHERE Salary > avgs

答案 4 :(得分:0)

预先计算每个部门的平均工资,并在进一步的查询中使用它。

 SELECT AVG(e2.Salary) as avgSalary,DepartmentID into #t
      FROM Employees 
      group by DepartmentID

SELECT e.ID, 
       e.Name
FROM
    Employees e
WHERE
    e.Salary > (
      SELECT avgSalary
      FROM #t e2
      WHERE e2.DepartmentID = e.DepartmentID)