not exists 中from 后面不同写法带来的效率区别

Windows 2003  ,   SQL Server 2000  SP4 .  


下面的语句运行非常慢,  在后面加入option(maxdop 1) 后变得快了很多 。 后来我们又做了测试,尝试将别名为b的table 显示的写在
not exists 后面的子查询中,  速度也从20多秒减低到1秒以内 。 当然执行计划也发生了变化 。 具体原因是什么 ?  




SELECT  '004' AS MSGFN,'OB20031120' AS AENNR,b.climat AS IDNRK,'L' AS POSTP,CONVERT(INT,b.SOITMNUM) AS POSNR,
b.ordqty AS MENGE_C ,'X' AS SANFE
FROM purchaseordersitem a (nolock) , purchaseordersitemdetail b (nolock)
WHERE  a.mesgid='0a5dc698-6cc4-49bd-ab0b-e33121f6ec44'
AND  a.ordnum='20058439390'  and a.itmnum='1' AND  a.mesgid= b.mesgid
AND  a.ordnum=b.ordnum and a.itmnum=b.itmnum and a.highlevel IS NOT NULL
AND  not exists
          (select * from purchaseorderscomponent(nolock)
                                 where climat=b.climat
   
                                        and rdnum='20058439390'
                                        and mesgid='0a5dc698-6cc4-49bd-ab0b-e33121f6ec44'
                                        and itmnum='1'
                                        and (  (ATTRIBNAME='InSystemBox'and ATTRIBVALUE='N')
                                                  or (ATTRIBNAME='PartType'and ATTRIBVALUE='OVERPACK')
                                             )
          )
ORDER BY POSNR ;





SELECT  '004' AS MSGFN,'OB20031120' AS AENNR,b.climat AS IDNRK,'L' AS POSTP,CONVERT(INT,b.SOITMNUM) AS POSNR,
b.ordqty AS MENGE_C ,'X' AS SANFE
FROM purchaseordersitem a (nolock) , purchaseordersitemdetail b (nolock)
WHERE  a.mesgid='0a5dc698-6cc4-49bd-ab0b-e33121f6ec44'
AND  a.ordnum='20058439390'  and a.itmnum='1' AND  a.mesgid= b.mesgid
AND  a.ordnum=b.ordnum and a.itmnum=b.itmnum and a.highlevel IS NOT NULL
AND  not exists
             (select * from purchaseorderscomponent c(nolock), purchaseordersitemdetail b (nolock)
                                 where c.climat=b.climat
                                        and c.ordnum='20058439390'
                                        and c.mesgid='0a5dc698-6cc4-49bd-ab0b-e33121f6ec44'
                                        and c.itmnum='1'
                                        and ((c.ATTRIBNAME='InSystemBox'and c.ATTRIBVALUE='N')
                                               or (c.ATTRIBNAME='PartType'and c.ATTRIBVALUE='OVERPACK')
                                             )
             )
ORDER BY POSNR ;
请使用浏览器的分享功能分享到微信等