create table A
(
ID int,
[Name] varchar(10)
)Create table B
(
ID int,
AID int,
[Name] varchar(10)
)
insert into A 
select 1 ,   'A1' union all
select 2 ,   'A2' union all
select 3,  'A3'
insert into B 
select 1 , 1,  'A1' union all
select 2 , 2,  'A2' union all
select 3,  2, 'A3' SELECT ID,[NAME] FROM A WHERE EXISTs (SELECT * FROM B WHERE A.ID=B.AID) 尝试了一下检查它的运行plan
应该是先扫描A,B表发现A.ID=B.AID
然后是一个nest loop(left semi join)怀疑是用了半join连接
测试下面这句SELECT distinct A.ID,A.[NAME] FROM B left join A on A.ID=B.AID 
执行计划基本上是一样的,只是最后加了一个distinct sort所以觉得EXISTs 语句如果又传递数据到子查询里面,一定程度上等价于一个左链接的判断
 
详细的执行,一步一步还是看不懂哦

解决方案 »

  1.   

    SET SHOWPLAN_all on; 
    go
    SQL語句
    go 
    SET SHOWPLAN_all off;樓主是在倒分?
      

  2.   

    http://blog.csdn.net/no_mIss/archive/2006/11/09/1374978.aspx
    MSSQL优化之————探索MSSQL执行计划
      

  3.   

    关键是不知道你具体想了解什么?执行的步骤?exists的用法?貌似都告诉你了.
      

  4.   


    您去已解决看看plglenn系列的很多帖子,没有哪一个倒分
      

  5.   

    SELECT ID,[NAME] FROM A WHERE EXISTs (SELECT * FROM B WHERE A.ID=B.AID) 步骤就是
    1:判断a.id = b.aid
    2:存在则返回全部结果,不存在则无结果.查询计划就是两表关联,各占50的资源,也就说,两表都逐一每行扫描.