今天寫了個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 了,當然各有千秋,只是個人想法,備忘。