2012-10-19 66 views
0

在此查詢:甲骨文使用索引,即使沒有過濾器criteeria指定

SELECT WTTEMPLATE.TEMPLATEuID, 
        MAX (WTTRX.VALUEDATE) AS template_last_use_date 
       FROM wttemplate, wttrx 
       WHERE WTTEMPLATE.TEMPLATEID = WTTRX.TEMPLATEID(+) 
        AND WTTEMPLATE.CUSTID = WTTRX.CUSTID 
      GROUP BY WTTEMPLATE.TEMPLATEuID 

解釋計劃顯示:在使用上WTTEMPLATE.TEMPLATEID和索引的索引快速全掃描(WTTRX.TEMPLATEID,WTTRX.CUSTID) 。我的問題是這樣的:我沒有指定任何過濾標準,那麼它如何使用索引?它應該做全面掃描...對嗎?

回答

1

您在where子句中使用TEMPLATEID。這就是爲什麼Oracle使用索引來加速查找連接操作的原因。

順便說一句:但你應該習慣使用標準JOIN語法,而不是隱含在WHERE子句中加入:

SELECT wttemplate.templateuid, 
     max (wttrx.valuedate) as template_last_use_date 
FROM wttemplate 
    LEFT JOIN wttrx 
     ON wttemplate.templateid = wttrx.templateid 
    AND wttemplate.custid = wttrx.custid 
GROUP BY wttemplate.templateuid 

改變Join語法不會改變執行計劃。這只是一個更好的清晰度問題,並且不易發生不需要的笛卡爾連接。