在我们可以使用JOIN的地方,在SQL语句中使用“IN”关键字是否存在任何性能问题?
SELECT xxx
FROM xxx
WHERE ID IN (SELECT Id FROM xxx)
答案 0 :(得分:10)
不,可以使用。
您可以在所有RDBMS中使用IN,EXISTS编写上述查询,有些还支持INTERSECT。
从语义上讲,这是一个半连接,它“给我表A中的行,其中我在tableB中至少有一个匹配”。 INNER JOIN是“给我所有匹配的行”
因此,如果TableA有3行而TableB有5行匹配:
这就是我和其他SQL类型推送IN和EXISTS的原因:JOIN错误,需要DISTINCT并且速度会慢。
EXISTS支持多列JOIN,IN不在SQL Server中(在其他情况下也是如此)。
答案 1 :(得分:0)
而不是一个独特的,你可以使用group by。我有过这样的情况,我使用join可以获得更好的响应时间。通常当我通过主键/外键关系连接所有行并且where在哪里查看非键列时。特别是如果有多个连接。 IN有时可以强制进行索引扫描,如果要进入PK,则连接将典型地使用搜索。在设计表格时,表格会排列主键,因此它们的顺序相同,并明确声明PK / FK关系。加入不限于PK / FK。但是,连接的一个常见用途是走PK / FK关系,在这种情况下,我使用连接键的连接的经验是最佳性能。
答案 2 :(得分:-1)
正如您可以阅读here,JOINS比子选择更快。