Oracle left join 和 where 條件應用時的效率研究


今天寫了個SQL語句,但是速度總是很慢,后來做些改動速度提升了幾倍,記錄下來心得,一起分享討論!

如:(1) select * from A   left join B  on A.b = B.b  left join C  on A.c = C.c  where 1=1 and A.d = 'XXXXX' and A.e = 'SSSSS'    

和   (2) select * from (select * from A   left join B  on A.b = B.b  left join C  on A.c = C.c ) aa where aa.d = 'XXXXX' and aa.e = 'SSSSS'   

兩條SQL執行結果一樣但是效率卻截然不同,個人原因分析如下:

1、(1)語句應該是表A每left join 一次就會where 條件過濾一次,這樣執行兩次where過濾

     (2)語句是在所有left join 之后統一用where 條件過濾的,這樣執行一次where 過濾    設想:加入A做為主表當與A表關聯的表特別多時,沒關聯一次就where 過濾一次

這樣無疑速度會慢,相比(2)無論關聯多少表只where 條件過濾執行一次效率相對要高一些。

引申:   將條件寫到on和where 的區別,當然是on較快,因為SQL執行順序是 on -where 而表連接是先on過濾然后過濾后的值再做笛卡爾積,這樣笛卡爾積的數值不至於較大,而條件寫到where的時候無疑是兩張較大的表的笛卡爾積,然后才where 條件。這樣就順序就是left join - on而不是先on 再left join 了,當然各有千秋,只是個人想法,備忘。 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM