Both queries generates a list of department IDs along with the number
of employees assigned to each department.
我能够使用连接和子查询获得上述结果,但我非常想知道
两个查询如何按performance
更好地工作:连接或子查询。
我为两个查询添加了解释计划屏幕截图,但我不明白这意味着什么。
使用加入
SELECT d.dept_id, d.name, count(emp_id) AS num_employee
FROM department d INNER JOIN employee e ON e.dept_id = d.dept_id
GROUP BY dept_id;
使用子查询
SELECT d.dept_id, d.name, e_cnt.how_many num_employees
FROM department d INNER JOIN
(SELECT dept_id, COUNT(*) how_many
FROM employee
GROUP BY dept_id) e_cnt
ON d.dept_id = e_cnt.dept_id;
答案 0 :(得分:4)
您可以在执行计划中看到,联接显然更好。 :P
子选择使用索引来获取初始表(count(*),dept_id),然后使用缓冲表连接到外部select语句以获得结果。
内部联接使用部门和员工的索引来确定匹配的行,从而节省自己创建缓冲区表和初始索引查找。