2013-08-27 43 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