如何使用多选优化 SQL 查询

Posted

技术标签:

【中文标题】如何使用多选优化 SQL 查询【英文标题】:How to optimize SQL query with multiple selects 【发布时间】:2018-12-11 00:24:10 【问题描述】:

我有一个使用多个 SELECTS 的查询,我需要对其进行优化,但我不知道该怎么做。

查询:

SELECT e.last_name, e.salary, t1.PROMEDIO 
FROM employees e, 
     (
       SELECT e.department_id, AVG(e.salary) PROMEDIO 
       FROM employees e 
       GROUP  BY e.department_id
     ) t1 
WHERE e.department_id = t1.department_id 
     AND e.salary < t1.PROMEDIO;

【问题讨论】:

第一个问题是,为什么你认为你需要优化这个?它运行缓慢还是您认为它会很慢? 【参考方案1】:

最好使用窗口函数来编写这个查询:

select e.* 
from (select last_name, department_id, salary, 
             avg(salary) over (partition by department_id) as avgsalary
      from employees e
     ) e
where salary < avgsalary;

为了提高性能,您需要在employees(department_id, salary) 上建立索引。

【讨论】:

【参考方案2】:

如果我对您的问题的理解正确,您正试图退回工资低于每个部门平均工资的所有员工。如果有,可以使用窗口函数avg() over()

select * 
from (
    select last_name, department_id, salary, 
         avg(salary) over (partition by department_id) avgsalary
    from employees
) t
where salary < avgsalary
Online Demo

【讨论】:

以上是关于如何使用多选优化 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用数千个 WHERE 子句优化 SQL 查询

如何使用 WHERE IN 子查询优化 SQL 查询

如何使用 JOINS 和嵌套 SELECT 优化此 SQL 查询?

优化 SQL:如何重写此查询以提高性能? (使用子查询,摆脱 GROUP BY?)

如何使用过滤器和分页优化 SQL Server 查询?

如何对Oracle sql 进行性能优化的调整