评估SQL查询性能

时间:2018-10-15 23:04:02

标签: mysql sql performance

我目前有两个版本的SQL查询,我试图了解在性能,成本等方面哪个更好。

这是这个问题:Average Salary: Departments VS Company

select department_salary.pay_month, department_id,
case
  when department_avg>company_avg then 'higher'
  when department_avg<company_avg then 'lower'
  else 'same'
end as comparison
from
(
  select department_id,
         avg(amount) as department_avg,
         date_format(pay_date, '%Y-%m') as pay_month
      from salary
      join employee on salary.employee_id = employee.employee_id
      group by department_id, pay_month
) as department_salary
join
(
  select avg(amount) as company_avg,
         date_format(pay_date, '%Y-%m') as pay_month
      from salary
      group by date_format(pay_date, '%Y-%m')
) as company_salary
on department_salary.pay_month = company_salary.pay_month
;

我的问题不是加入,而是他们可以在case语句本身中使用第二个表。

select a.pay_month,
       a.department_id,
       (case when avg(a.salary) > (
             select avg(e.salary)
                 from employee e
                 where e.pay_month = a.pay_month)
        then 'higher'
        else 'lower' end) as comparison
from employee a
group by a.pay_month,a.department_id;

哪个更好?加入真的有必要吗?

1 个答案:

答案 0 :(得分:1)

要确定哪个更好,您应该测试性能。有时,使用关联子查询的性能要比显式join替代方案好得多。

当您问:“加入真的有必要吗?”我认为您的意思是“ join确实必要”。显然,有时您可以在没有显式join的情况下表达查询。不过,在后台,数据库正在实现联接算法(可能是嵌套循环或索引查找)来完成工作。

几乎可以回答这个问题。 SQL通常提供多种方法来实现相同的目标。因此,您通常可以使用join或不使用join来表达逻辑。请注意,相关子查询实际上等效于left join而不是inner join