mssql sqlserver 记载”子查询导致查询变慢”的经历及处理方法


摘要:
下文展示一次sql 子查询带来的效率慢的现象,
后续在实际项目开发中,如果遇见子查询,能转换为连接写法的,尽量采用连接的方式,
示例如下所示:


例:

 --1.连接写法获取a表中sortId存在于B表中的信息
 --耗时 0.002s
  select a.name,a.sortId from tableInfo as a 
   (
    select b.sortId,b.nameB from  [tableInfo2] as b 
   ) where a.sortId = b.sortId 
---------------------------------------------------

--2.采用子查询写法获取a表中sortId存在于B表中的信息
--耗时 2.500s
  select a.name,a.sortId from tableInfo as a 
    where a.sortId in (select  sortId from [tableInfo2] as b where  a.sortId = b.sortId) 


总结:
经过对比分析,发现子查询速度的速度比关联查询慢N倍
————————————————-
通过仔细分析代码,我们发现

子查询的操作方式,a表每行记录都会遍历b表的所有记录,
这会使逻辑读的次数明显大于连接查询,
这也是导致子查询的查询速度比连接查询慢的主要原因