oracle使用索引,即使没有指定过滤器criteeria

时间:2012-10-19 22:58:37

标签: oracle11g sql-execution-plan

在此查询中:

 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 个答案:

答案 0 :(得分: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

更改连接语法不会更改执行计划。这只是一个更清晰的问题,并且不太容易出现意外的笛卡尔联接。