我有两张桌子:
Foo
,行数为24.000.000 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)
编辑:评论中提出了第三个选项。我没有考虑加入,因为我不需要Bar的任何列
SELECT * FROM Foo as F
JOIN Bar as B on B.Baz = F.Baz
但在查看两个查询的执行计划后,我无法发现差异。这些查询真的相同吗? 哪个查询更好?
在EXISTS
和IN
之间做出决定时,我应该考虑什么?我想知道SQL Server是否足够聪明,可以执行一次嵌套查询并存储结果以进行比较,还是为每行执行嵌套查询?
答案 0 :(得分:4)
EXISTS
或IN
都可以。
两者都应该为same plan提供逻辑半连接运算符(NULL
不会更改此处的语义,而不像NOT IN
/ NOT EXISTS
)
替换为INNER JOIN
可能会更改结果,除非Baz
中Bar
保证唯一。{1}}。
如果没有此约束,内部联接可能会带回您需要使用DISTINCT
摆脱的其他行。
答案 1 :(得分:0)
这不是一样的,但不那么令人困惑吗?您描述的场景适用于内部联接。
SELECT F.* FROM Foo as F inner join Bar as B on F.Baz=B.Baz