IN vs INNER JOIN

来源:互联网 发布:经传全套指标公式源码 编辑:程序博客网 时间:2024/05/18 06:20
以前一直认为IN肯定会导致效率问题,而INNER JOIN从名称来看应该是比较快的,今天特意做了一个简单的测试,具体如下:

针对本机SharePoint的两张表写了两个SQL语句

 

select * from AllDocs where ListId in (select tp_ID from AllLists where tp_WebId='guid')

 

select * from AllDocs inner join AllLists on dc.ListId = l.tp_ID and tp_WebId = 'guid'

 

从返回内容来看,二者的结果是一样的,那么就让我们比较一下二者的效率吧,可以看如下执行计划分析:

 

然后再看一下在数据库中真正的执行情况:

 

最后我们具体分析此SQL语句中的IN和INNER JOIN的不同,也就是执行计划分析中的唯一不同支持——Right Semi Join和Inner Join。

查了很多关于Right Semi Join的解释,看着都比较糊涂,不经意的看到一篇文章中这样写道:"semi joins are joins that stop when the first hit is encountered. They are used many times for "existence" checks.” 突然有种恍然大悟的感觉,所谓的“半部连接”原来是指不做交叉匹配的意思。这就比较容易解释为什么上述两条SQL语句中为什么第一条要比第二条在执行计划中稍快,并且在实际执行中也少了很多Logical Read的操作。

 

通过以上描述,我们可以知道,IN操作可以保证操作表数据的唯一性,而INNER JOIN一旦条件用的不对的话,会出现很多重复数据,导致查询结果的不准确。并且IN并不是查询效率慢,而是要看具体怎么使用,在各种情况下,不同的使用方式会得到不同的执行效率结果的。