在此查询中:
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)上的索引进行索引快速完全扫描。我的问题是:我没有指定任何过滤条件,那么它如何使用索引?它应该进行全扫描......对吧?
答案 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
更改连接语法不会更改执行计划。这只是一个更清晰的问题,并且不太容易出现意外的笛卡尔联接。