我知道 Oracle 有时会“判断”最好执行全表扫描而不是索引扫描,但仍处于“学习阶段”,我只是想更好地了解“何时”oracle 将确定最佳路线。例如,我有一个简单的查询:
Select *
FROM GLMV_JOURNAL_LOGS JLOG
INNER JOIN GLMV_Transact_Details TDTL
ON TDTL.TR_REF_NO = JLOG.TR_REF_NO
AND TDTL.SCAT_KEY = JLOG.Scat_key
AND TDTL.CASE_KEY = JLOG.CASE_KEY
AND TDTL.TR_CD = JLOG.TR_CD
INNER JOIN FUND_DESC FDDC
ON FDDC.FD_DESC_ID = TDTL.FD_DESC_ID
INNER JOIN FD_RATES FDRT
ON FDRT.FDRT_KEY = TDTL.FDRT_KEY
INNER JOIN BEN_TYPES BNTP
ON BNTP.BNTP_KEY = FDRT.BNTP_KEY
WHERE JLOG.JRNL_CD = '0'
AND JLOG.SRC_CD = '2'
AND JLOG.MKEY_FD_NUM <> 0
AND NVL(JLOG.TMOV_KEY, -1) > 0
AND NVL(JLOG.ORIG_SCAT_KEY, 1) = 1
AND TDTL.STAT_CD <> '4'
AND NVL(TDTL.ORIG_SCAT_KEY, 1) = 1
FD_RATES 上的连接是 PK 值上的连接,我还在 GLMV_Transact_Details 上创建了一个相应的索引,认为会阻止全表扫描,但是,根据下面的解释计划,即使在我执行索引重建之后,它也不是并收集表格统计信息,结果仍然相同:
现在,如果我进入查询并添加以下 where 子句:
AND FDRT.FDRT_KEY = 100
索引当然会启动,但我想我很好奇为什么它不是在进行内部连接时......有什么提示吗?