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