2013-08-27 42 views
2

我有兩個表:我應該使用EXISTS或IN

  1. Foo與24.000.000行
  2. Bar有16行

我考慮重寫查詢

SELECT * FROM Foo as F 
WHERE EXISTS (SELECT 1 FROM Bar as B WHERE B.Baz = F.Baz) 

與這一個

SELECT * FROM Foo 
WHERE Baz IN (SELECT Baz FROM Bar) 

編輯:評論中提出了第三個選項。我並沒有考慮加入,因爲我不從酒吧

SELECT * FROM Foo as F 
JOIN Bar as B on B.Baz = F.Baz 

但是看着兩個查詢我無法看出其中的區別執行計劃後需要任何列。這些查詢是否真的相同? 哪個查詢更好?

在決定EXISTSIN之間時應該考慮什麼。我想知道SQL Server是否足夠聰明,可以執行一次嵌套查詢並存儲結果以進行比較,還是執行每行的嵌套查詢?

+5

'SELECT Foo。* FROM Foo JOIN Bar on Bar.Baz = Foo.Baz'? –

+3

我會使用'EXISTS'但不是出於性能原因,請閱讀:[我應該使用NOT IN,OUTER APPLY,LEFT OUTER JOIN,EXCEPT還是NOT EXISTS?](http://www.sqlperformance.com/2012/ 12/t-sql-queries/left-anti-semi-join)我認爲'EXISTS/IN'也是如此。 –

+0

@TimSchmelter我只是從你以前的回答中尋找這個鏈接。幸運的我,你碰巧落入。 –

回答

4

無論EXISTSIN的罰款。

都應該給你same plan與邏輯半聯接運算符(NULL不會改變這裏的語義不像NOT IN/NOT EXISTS

INNER JOIN更換可能會改變結果,除非Baz保證是獨特Bar

沒有這個限制,內部連接可能會帶來額外的行,然後您需要使用DISTINCT擺脫。

0

難道這不是一樣好,但較少混淆?你描述的場景適用於內部聯接。

SELECT F.* FROM Foo as F inner join Bar as B on F.Baz=B.Baz