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

前面几篇文章讲到了:

标量子查询、聚合标量子查询、行转列标量子查询、带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次,效率提高不少。

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

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值