改写优化SQL(6):尽量少用标量子查询

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

前面几篇文章讲到了:

标量子查询、聚合标量子查询、行转列标量子查询、带top的标量子查询 如何转成left join。

之所以要转换,主要是因为标量子查询虽然写法上比较直观,容易理解,不用想就知道怎么写,但是存在:代码重复、多次访问同一个表 问题,所以效率比较低。


一、标量子查询的模板

按标量子查询方式,写出来的sql,都类似下面的代码:

select tb.col1,
       tb.col2,

	   --下面的代码是重复的,表和连接条件都类似,只是最后显示的字段不同
	   (select x1 from t where t.id = tb.id) as x1,
	   (select x2 from t where t.id = tb.id) as x2,
	   (select x3 from t where t.id = tb.id) as x3,
       (select x4 from t where t.id = tb.id) as x4,
	   ...
from tb

可以看到,其中x1、x2、x3、x4等列,大部分代码都是重复的。

当然,代码重复本身并没有太大的问题,最多就是复制粘贴,拷贝多次,然后把字段名改改,就行了。


二、标量子查询的执行过程

上面的sql经过sql server的优化,生成执行计划,执行过程类似如下的过程:

(1)从tb表中取一条数据,用其中的id值,第1次和t表中的id值进行比较,如果相等,就返回t表的x1字段的值。

(2)从tb表中取一条数据,用其中的id值,第2次和t表中的id值进行比较,如果相等,就返回t表的x2字段的值。

(3)从tb表中取一条数据,用其中的id值,第3次和t表中的id值进行比较,如果相等,就返回t表的x2字段的值。

(4)从tb表中取一条数据,用其中的id值,第4次和t表中的id值进行比较,如果相等,就返回t表的x2字段的值。

(5)按照上述过程遍历整个tb表的每一条数据。

从上面的过程可以看出,一共访问了t表4次,做了很多无用功。


如果改成left join的方式,只需要访问1次t表,少访问3次,效率提高不少。

所以,要尽量少用标量子查询的写法。

猜你喜欢

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