我应该使用EXISTS还是IN

时间:2013-08-27 11:07:20

标签: sql-server tsql

我有两张桌子:

  1. Foo,行数为24.000.000
  2. Bar有16行
  3. 我正在考虑重写查询

    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)
    

    编辑:评论中提出了第三个选项。我没有考虑加入,因为我不需要Bar的任何列

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

    但在查看两个查询的执行计划后,我无法发现差异。这些查询真的相同吗? 哪个查询更好?

    EXISTSIN之间做出决定时,我应该考虑什么?我想知道SQL Server是否足够聪明,可以执行一次嵌套查询并存储结果以进行比较,还是为每行执行嵌套查询?

2 个答案:

答案 0 :(得分:4)

EXISTSIN都可以。

两者都应该为same plan提供逻辑半连接运算符(NULL不会更改此处的语义,而不像NOT IN / NOT EXISTS

替换为INNER JOIN可能会更改结果,除非BazBar保证唯一。{1}}。

如果没有此约束,内部联接可能会带回您需要使用DISTINCT摆脱的其他行。

答案 1 :(得分:0)

这不是一样的,但不那么令人困惑吗?您描述的场景适用于内部联接。

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