2

我有两张桌子:

  1. Foo有 24.000.000 行
  2. Bar16行

我正在考虑重写查询

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 是否足够聪明,可以执行一次嵌套查询并存储结果以进行比较,还是对每一行执行嵌套查询?

4

2 回答 2

4

要么 要么EXISTSIN很好。

两者都应该使用逻辑半连接运算符为您提供相同的计划(与/NULL不同,这里的语义不会改变)NOT INNOT EXISTS

用 an 替换INNER JOIN可能会改变结果,除非 ifBaz保证在 中是唯一的Bar

如果没有这个约束,内部连接可能会带回额外的行,然后您需要用DISTINCT.

于 2013-08-27T12:00:10.380 回答
0

这不也是一样但不那么混乱吗?您描述的场景适用于内部连接。

SELECT F.* FROM Foo as F inner join Bar as B on F.Baz=B.Baz
于 2013-08-27T11:12:36.247 回答