改写优化SQL(1):标量子查询改为left join

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yupeigu/article/details/79148844

标量子查询就是在select中出现的子查询,效率相对来说比较低,建议修改为效率更高的left join。

一、建表

CREATE TABLE tb_emp
(
emp_id INT NOT NULL PRIMARY KEY CLUSTERED,
emp_name VARCHAR(20) NOT NULL,
tel VARCHAR(20) null
)

INSERT INTO dbo.tb_emp
VALUES
(1, '张三','1234567890'),
(2, '李四','9876543210'),
(3, '王五','12345'),
(4, '孙六','666666666'),
(5, '半泽直树','8888888888');


CREATE TABLE tb_org
(
org_id INT NOT NULL PRIMARY KEY CLUSTERED,
org_name VARCHAR(30) NOT NULL,
parent_org_id INT NULL,
emp_id INT NULL
)


INSERT INTO tb_org(org_id,org_name,parent_org_id,emp_id)
VALUES
(1, '行长', NULL,1),
(2, '常务', 1,2),
(3, '专务', 1,3),
(4, '营业二部部长', 3,4),
(5, '营业二部次长', 4,5);

二、标量子查询写法

SELECT o.org_id,
       o.org_name,
	   (SELECT emp_name FROM tb_emp e WHERE e.emp_id = o.emp_id) AS emp_name,
	   (SELECT tel FROM tb_emp e WHERE e.emp_id = o.emp_id) AS emp_tel
FROM tb_org o
执行计划:



三、left join写法

把标量子查询的写法,转成left join:

SELECT o.org_id,
       o.org_name,
	   e.emp_name,
	   e.tel AS emp_tel
FROM tb_org o
LEFT JOIN tb_emp e
ON e.emp_id = o.emp_id

执行计划:



总结:

从上面的执行计划看,标量子查询的写法,对tb_emp访问了2次,而改写为left join的写法后,执行计划变得更简单,对tb_emp只访问了1次,效率的差异立见分晓。

另外,还有一个问题:虽然sql server的优化器会对sql进行优化,但是并不能把标量子查询,优化为left join的写法,因为优化器并不知道编写sql的人的意图到底是什么。

所以还是的大家写sql时,有意识的,少用标量子查询,多用join的写法来实现。



猜你喜欢

转载自blog.csdn.net/yupeigu/article/details/79148844