in和exists的区别与执行效率问题解析

豆豆网   技术应用频道   2008年01月18日  【字号: 收藏本文

内容摘要:本文对in和exists的区别与执行效率的问题进行了全面整理分析……

  最近在很多论坛上看到大家又开始讨论in和exists的区别与执行效率的问题,想想还是把一些东西整理出来会比较好一些:

  in可以分为三类:

  1、形如select * from t1 where f1 in ( 'a ', 'b '),应该和以下两种比较效率

  select * from t1 where f1= 'a ' or f1= 'b '

  或者 select * from t1 where f1 = 'a ' union all select * from t1 f1= 'b '

  你可能指的不是这一类,这里不做讨论。

  2、形如select * from t1 where f1 in (select f1 from t2 where t2.fx= 'x '),

  其中子查询的where里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成exist语句,也就是效率和exist一样。

  3、形如select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx),

  其中子查询的where里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少,一般认为效率不如exists。

  除了第一类in语句都是可以转化成exists 语句的,一般编程习惯应该是用exists而不用in.

  A,B两个表,

  (1)当只显示一个表的数据如A,关系条件只一个如ID时,使用IN更快:

  select * from A where id in (select id from B)

  (2)当只显示一个表的数据如A,关系条件不只一个如ID,col1时,使用IN就不方便了,可以使用EXISTS:

  select * from A

  where exists (select 1 from B where id = A.id and col1 = A.col1)

  (3)当只显示两个表的数据时,使用IN,EXISTS都不合适,要使用连接:

来源:IT专家网    作者:Peak Wong    责编:豆豆技术应用

正在加载评论...