sql中in()效率低?

我写sql 是select~~~ where 字段 not in(select 字段 ~~~~)
然后老员工说这样效率低
那如果不这么写 还能怎么写呢~~~~
那用exists和表连接效率就高?
select a.* from a where exists (select 1 from b where a.id<>b.id)不等于not in么

对于in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-06-11
这个其实是根据SQL SEVER的执行计划来的 举个例子你就明白了

select~~~from 表1 where 字段 not in(select 字段 ~~from 表2~~)
程序的操作过程:
从表1中取出第1条记录 然后再去执行select 字段 ~~from 表2~ 获得结果集 假设是X 比对记录1中的这个值是否存在于结果集X中
取出第2条记录 执行select 字段 ~~from 表2~ 获得结果集X 比对记录2中的这个值是否存在于结果集X中
然后第3条...
看出问题在哪么?
问题是 他每次都执行一遍 "select 字段 ~~from 表2~" 你说速度能快么?

推荐做法

select a.*
from table1 a
left join (select PK from table2) b on a.PK=b.PK
where b.PK is null

这里select PK from table2只需要做一遍 速度要快一些
第2个回答  2010-06-12
还是wforce说的是那么回事,纯粹脱离语境讨论谁效率低是无稽之谈,要真如此,还不如取消IN语句。
第3个回答  2010-06-11
select a.* from a where a.id in (select b.id from b)
改成

select a.* from a where exists (select 1 from b where a.id=b.id)

为什么sql语句使用IN的效率不好?
in的效率是比较低的,但不大会和LEFT JOIN做比较,一般是和exists做比较的。in的实质就是无数个=,中间用OR连接起来 比如IN (1,2,3)实质上就是=1 or =2 or =3,效率自然不高

sql中in()效率低?
对于in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,...

关于sql中in 和 exists 的效率问题,in真的效率低吗
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)效率低,用到了A表上cc...

SQL中IN和EXISTS用法的区别
in无法索引,exists里面的查询可以索引查询,所以数据量大的时候in效率会低于exists,如果无索引情况下,差距并不大,但这种情况一般比较少,查询一般都会想办法去索引查询 not in 全文全字段查询比对,not exists后面的查询一般也都是索引查询,所以效率也会差别很大 ...

sql 语句中in ,not in
如果系统不自动优化,并且IN的结果很多,那么有可能IN和NOT IN的效率低些。所有的IN都可以转换为EXISTS,同样NOT IN可以转换为NOT EXISTS,下面说明IN转换为EXISTS的方法,NOT的类似:IN的语句:SELECT * FROM A WHERE F IN (SELECT F FROM B)可以转换为如下的EXISTS语句:SELECT * FROM A WHERE ...

sql in效率低
当然是遍历1遍了,只不过对table中每一条都要判断id是否在(1,2,3,4)中,如果id是整数可改成between 1 and 4

SQL 中的 in 与 not in、exists 与 not exists 的区别以及性能分析...
in通常通过hash连接操作,效率取决于两个表的大小,当表相当时,两者性能相近。如果子查询表大,用exists;反之,子查询表小,用in。如表A(小表)与表B(大表)的查询。2. not in与not exists:not in与逻辑上的not exists不完全等同,误用可能导致错误。not in通常全表扫描,效率较低,除非子...

sql查询效率
我想是这样的,IN后面的子查询数据越多,相对EXISTS查询就会越慢。IN子查询中的记录只有几十条件,那么应该是效率很高的,因为其只查询单个字段,如果这个字段是被索引过的,会更快 EXISTS相对于查询子表数据较多的情况。可以这样想,EXISTS每个子查询是一条记录。而IN子查询每个子查询会是多条甚至数万条...

SQL语句中 in和or的区别
SQL语句中 in和or的区别为:操作不同、适合不同、执行效率不同。一、操作不同 1、in:in是把父查询表和子查询表作hash连接。2、or:or是对父查询表作loop循环,每次loop循环再对子查询表进行查询。二、适合不同 1、in:in适合用于子查询表数据比父查询表数据多的情况。2、or:or适合用于子查询...

SQL中用IN和自段=''AND自段=''的区别
有区别,COULMN IN(A,B) 相当于COULMN='A' or COULMN='B'是or不是and

相似回答