從原理上來講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快的原因