not exists 中from 後面不同寫法帶來的效率區別

tolywang發表於2010-12-16
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 ;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-681952/,如需轉載,請註明出處,否則將追究法律責任。

相關文章