Left Join 比Join快的情況淺析

從原理上來講Join在邏輯運算上比Left Join會少但有些業務情況下爲什麼反而會慢?
如下Sql語句:

select sonACD.ID 
    from 
        MN_ACD_DETAIL as sonACD 
    left join 
        MN_ACD_DETAIL as inbound 
            on sonACD.ANI=inbound.ANI 
    left join 
        call_detail_record as cdr 
            on sonACD.UCID=cdr.ucid 
    where 
        sonACD.ANSWER_TIME!=0 
    group by 
        sonACD.ID 

select sonACD.ID 
    from 
        MN_ACD_DETAIL as sonACD 
    inner join 
        MN_ACD_DETAIL as inbound 
            on sonACD.ANI=inbound.ANI 
    inner join 
        call_detail_record as cdr 
            on sonACD.UCID=cdr.ucid 
    where 
        sonACD.ANSWER_TIME!=0 
    group by 
        sonACD.ID 

在數據庫跑時發現前者明顯比後者快
查詢執行計劃發現,left join時只打描MN_ACD_DETAIL一次,而inner join時MN_ACD_DETAIL掃描兩次,call_detail_record 一次!而原因也就在這。
通過查詢開銷可以發現前者需要合併聯接兩次而後者在合併聯接上打開銷爲0%,後者所有的開銷都用在聚集索引掃描上,前者先查出了sonACD 與inbound 聯接的結果再與call_detail_record 聯接返回,
而left join必定有數據庫對其優化,以sonACD 爲主同時索引inbound 與cdr 查到符合條件立即返回。
這就是Left Join 有時比Join快的原因

發佈了35 篇原創文章 · 獲贊 30 · 訪問量 2279
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章