sql中in()效率低?
我写sql是select~~~where字段notin(select字段~~~~)然后老员工说这样效率低那如果不这么写还能怎么写呢~~~~那用exists和表连接效率就高...
我写sql 是select~~~ where 字段 not in(select 字段 ~~~~)
然后老员工说这样效率低
那如果不这么写 还能怎么写呢~~~~
那用exists和表连接效率就高?
select a.* from a where exists (select 1 from b where a.id<>b.id)不等于not in么 展开
然后老员工说这样效率低
那如果不这么写 还能怎么写呢~~~~
那用exists和表连接效率就高?
select a.* from a where exists (select 1 from b where a.id<>b.id)不等于not in么 展开
4个回答
展开全部
对于in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。
展开全部
这个其实是根据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只需要做一遍 速度要快一些
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只需要做一遍 速度要快一些
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
还是wforce说的是那么回事,纯粹脱离语境讨论谁效率低是无稽之谈,要真如此,还不如取消IN语句。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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)
改成
select a.* from a where exists (select 1 from b where a.id=b.id)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询