评估 SQL 查询性能



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

这是这个问题:平均工资:部门 VS 公司

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;

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

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

当你问:"真的有必要加入吗? 我想你的意思是"join真的有必要吗"。 显然,您有时可以在没有显式join的情况下表达查询。 但是,在后台,数据库正在实现一个连接算法(可能是嵌套循环或索引查找(来完成这项工作。

这几乎回答了这个问题。 SQL 通常提供多种方法来实现同一目标。 因此,您通常可以用join或不带join来表达逻辑。 只有一个警告:相关子查询实际上等同于left join而不是inner join

最新更新