使用和不使用连接查询性能

时间:2016-08-19 10:37:18

标签: sql sql-server database

假设我们有两个表

客户订单

客户表: -

custid  custname
------- ---------
  1     aaa
  2     bbb
  3     ccc

订单表: -

   orderid  custid   date 
  --------  ------   -----
    101        1     2016-03-01
    102        1     2016-03-03
    103        2     2016-03-01

现在,我们已经展示了没有订单的客户

我们可以通过以下几种方式实现: -

1.没有加入

Select custid 
from  Customers 
where custid not in
    (Select custid from Orders)

2.加入

Select C.custid
from Customers C left join Orders O 
on C.custid = O.custid
where O.orderid is null

我被问到会有任何性能差异吗?如果,哪个会做得更好以及为什么?

1 个答案:

答案 0 :(得分:2)

两个查询都不同,因此比较无效..查询相同/获得相同的执行计划..

1.使用Not IN *

在第一个查询中重置Not Exists

如果你这样做,你可能会得到同样的计划,同时进行同样的处理......

*为什么要求删除Not IN,除了涉及空值时可能会给你带来奇怪结果的原因之外,可以从这个答案中找到Not IN vs Not Exists

从答案中粘贴相关条款..

  

目前执行计划可能相同,但如果将来更改任一列以允许NULL,NOT IN版本将需要做更多工作(即使数据中实际上没有NULL)和语义NOT IN如果存在NULL则不太可能是你想要的那些。