オラクルは、インデックススキャンではなくフルテーブルスキャンを実行する方が良いと「判断」することがありますが、まだ「学習段階」にあるため、「いつ」オラクルが最適なスキャンを決定するかをよりよく理解しようとしています。ルート。たとえば、単純なクエリがあります。
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
もちろん、インデックスは起動しますが、なぜ内部結合を行うときにそうでないのか、興味があると思います....何かヒントはありますか??