建了t1和t2两个表,表结构一样(id int,power float)
declare @i int
set @i=1
while(@i<10000)
begin 
insert into t2 values(@i,rand(datepart(ms,getdate())))
set @i=@i+1
end
这种方式插入数据,t1有10000条,t2有30000条,刚开始都没创建索引,
select id,power from t1
where power in (select power from t2)select id,power from t1
where exists
(select null from t2 where t1.power=t2.power)
用执行计划看了一下,发现两条语句的时间是一样的,
后来单独用t2(power)建了个nonclustered index,再测还是一样,
再又为t1(power)建了nonclustered index,还是一样。
不知道为什么,难道解析器自己为sql语句做了优化?

解决方案 »

  1.   

    这个问题在《Microsoft SQL Server 2005技术内幕 T-SQL查询》中文版一书中第200页有解释到
      

  2.   

    记得 以前邹老大好像说过,  exists 的效率 比in  快  只能说是快点  他那片帖子我记不住了, 只是有这个印象 .
      

  3.   

    本人依书直说,在SQL Server2000之前的版本中,优化器为Exists和IN生成不同的执行计划
    而且Exists的性能更好些,因为它具有短路功能。
    然后,在SQL Server2000和SQL Server2005中,优化器通常会为两逻辑等价的查询生成相同的计划,