1. 程式人生 > >Sql語句優化之用exists、not exists替代in、not in

Sql語句優化之用exists、not exists替代in、not in

在許多基於基礎表的查詢中,為了滿足一個條件,往往需要對另一個表進行聯接。在這種情況下, 使用exists(或not exists)通常將提高查詢的效率。在子查詢中,not in子句將執行一個內部的排序和合並。無論在哪種情況下,not in都是最低效的 (因為它對子查詢中的表執行了一個全表遍歷)。為了避免使用not in ,我們可以把它改寫成外連線(Outer Joins)或not exists。 
例如:查詢 Sendorder表中的冗餘資料(沒有和reg_person或worksite相連的資料) 
sql="select Sendorder.id,Sendorder.reads,Sendorder.addtime from Sendorder where Sendorder.person_id not in(select user_id from reg_person ) or Sendorder.worksite_id not in(select id from worksite) order by Sendorder.addtime desc" 

程式執行時間:40109.38毫秒 
sql="select Sendorder.id,Sendorder.reads,Sendorder.addtime from Sendorder where not EXISTS (SELECT id FROM reg_person where reg_person.user_id=Sendorder.person_id) or not EXISTS (SELECT id FROM worksite where worksite.id=Sendorder.worksite_id) order by Sendorder.addtime desc" 
程式執行時間:8531.25毫秒