SQL 中的 in 与 not in、exists 与 not exists 的区别以及性能分析
in和exists
not in 和not exists
in 与 = 的区别
1、in和exists
in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in;
例如:表A(小表),表B(大表)
select * from A where cc in(select cc from B) //效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=A.cc) //效率高,用到了B表上cc列的索引。
相反的:
select * from B where cc in(select cc from A) //-->效率高,用到了B表上cc列的索引
select * from B where exists(select cc from A where cc=B.cc) //-->效率低,用到了A表上cc列的索引。
2、not in 和not exists
not in 逻辑上不完全等同于not exists,如果你误用了not in,小心你的程序存在致命的BUG,请看下面的例子:
// An highlighted block
create table #t1(c1 int,c2 int);
create table #t2(c1 int,c2 int);
insert into #t1 values(1,2)