2016-08-19 60 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行 –