in 和 exists的性能区别

子查询结果集记录较少,主查询中的表较大且又有索引时应该用in,

反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。

以驱动表的快速返回为目标,驱动顺序的改变是性能变化的关键,

如果是exists,那么以外层表为驱动表,先被访问,

如果是IN,先执行子查询

IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

比较使用 EXISTS 和 IN 的查询

本示例所示查询查找由位于以字母 B 开头的城市中的任一出版商出版的书名:

USE pubs
GO
SELECT title
FROM titles
WHERE EXISTS
(SELECT *
FROM publishers
WHERE pub_id = titles.pub_id
AND city LIKE 'B%')
GO
-- Or, using IN:
USE pubs
GO
SELECT title
FROM titles
WHERE pub_id IN
(SELECT pub_id
FROM publishers
WHERE city LIKE 'B%')
GO

补充部分[来自JavaEye]:
关键字: in与exists和inner join执行效率 
in数据量少效率还可以,数据量大就效率低 
exists的效率依赖于匹配度。
inner join效率比较稳定。
原文地址:https://www.cnblogs.com/ding0910/p/1428203.html