2016-08-19 57 views
1

假设我们有两个表与查询性能并没有加入

客户订单

客户表: -

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.Without加入

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 

我被问到是否会有任何性能差异?如果哪个更好,为什么?

回答

2

两个查询是不同的,所以比较不有效..for查询是相同/获得相同的执行计划..

1.Replace Not INNot Exists *

第一查询,如果您做到这一点,你可能会得到同样的计划,这两个查询和同样的待遇...

*为什么是Not IN要求被删除,除了它可能会给你带有奇怪的结果,当涉及到零时,可以从这回答Not IN vs Not Exists

0123从答案项

粘贴相关条款..

执行计划可以是相同的时刻,但如果任一列在未来改变,以允许空值的NOT IN的版本需要做更多的工作(甚至如果数据中实际不存在NULL),如果NULL存在,则NOT IN的语义不可能是您想要的。

+0

'2.删除第二个查询中的where子句给出错误结果 –

+1

它们在OP变体中给出了相同的结果。 2排。没有WHERE子句,它给832行 –