Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1078929
  • 博文数量: 1647
  • 博客积分: 80000
  • 博客等级: 元帅
  • 技术积分: 9980
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 15:15
文章分类

全部博文(1647)

文章存档

2011年(1)

2008年(1646)

我的朋友

分类:

2008-10-28 18:29:22


  在撰写SQL时,常常会烦恼要使用IN or EXISTS,在效能考量下,如何最快的做出抉择呢?
  
  这是我的阅读经验,详细的内容请参考最后的连结,有更详尽的介绍。
  
  如果使用IN,执行过程将如同下列所示:
  
  Select * from T1 where x in ( select y from T2 )
  
  LIKE:
  
  select *
  from t1, ( select distinct y from t2 ) t2
  where t1.x = t2.y;
  
  如果使用EXISTS,如同上述的查询结果,我们改写成:
  
  select * from t1 where exists ( select null from t2 where y = x )
  
  LIKE:
  
  for x in ( select * from t1 )
  loop
  if ( exists ( select null from t2 where y = x.x )
  then
  OUTPUT THE RECORD
  end if
  end loop
  
  所以可以想想其中差异,当子查询的表格是一个储存巨大资料量的表格时,则使用第一个方法的效能将比较差,因为他的执行计画是使用SORT MERGE JOIN,相对的如果子查询的TABLE相对比较小,使用IN的执行效率应该比较佳。
  
  而如果外部的表格(例如t1)是相对的储存大量资料,则採用第一个方法IN的效率将会比较好,如果你使用EXISTS,则除了会对t1这个bigtable进行full scan外,还会一笔一笔读取所有t1的资料列,效能自然较差。
  
  简单的一句话,外大内小=IN,外小内大=EXISTS,这是一个实用的概略评估方法,在大部分的情况下是适用的。
【责编:admin】

--------------------next---------------------

阅读(246) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~