0

在此查询中:

 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) 上的索引进行索引快速全扫描。我的问题是:我没有指定任何过滤条件,那么它如何使用索引?它应该进行全面扫描...对吗?

4

1 回答 1

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

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

于 2012-10-19T23:16:03.620 回答