Oracle11g oracle使用索引,即使未指定筛选条件

Oracle11g oracle使用索引,即使未指定筛选条件,oracle11g,sql-execution-plan,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

在此查询中:

 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)上的索引对快速完全扫描进行索引。我的问题是:我没有指定任何筛选条件,所以它如何使用索引?它应该执行完全扫描…对吗?

您正在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
更改联接语法不会更改执行计划。这只是一个更清晰的问题,而且不太容易出现不必要的笛卡尔连接