2

因此,我在 Oracle 11Gr2 中正确/任何使用索引时遇到了一些问题,我试图更好地了解我的解释计划如何与我的查询相关联,以便我可以正确应用索引。运行以下查询时:

 SELECT JLOG1.JLOG_KEY,
            JLOG1.SRC_CD,
            JLOG1.JRNL_AMT,
            CASD.CONT_NO,
            SUM (NVL (VJLOG.TDTL_AMT, 0)) TDTL_SUM
       FROM GL_Journal_Logs JLOG1,
            GL_JLOG_Details VJLOG,
            CASE_DATA CASD
      WHERE  VJLOG.JLOG_KEY(+) = JLOG1.JLOG_KEY
            AND CASD.CASE_KEY(+) = JLOG1.CASE_KEY
            AND JLOG1.JRNL_CD = '0'
            AND JLOG1.SRC_CD = '2'
            AND JLOG1.ACCT_IF_CD = '0'
   GROUP BY JLOG1.JLOG_KEY, JLOG1.SRC_CD,JLOG1.JRNL_AMT, CASD.CONT_NO
    HAVING JLOG1.JRNL_AMT <> SUM (NVL (VJLOG.TDTL_AMT, 0));

我得到以下解释细节:在此处输入图像描述

我可以理解,我的联接“键”(JLOG_KEY 或 CASE_KEY)上的索引不一定适用,因为它是外部联接(或者应该是?),但是在 JLOG1(JRNL_CD、SRC_CD、ACCT_IF_CD)上创建索引时,技术上考虑到我的“where”条款,这些会生效吗?

鉴于这种情况,我应该创建任何索引还是有更好的方法?

4

1 回答 1

2

根据谓词中列的基数,可以在 GL_JLOG_DETAILS 表上使用适当的索引,从而避免全表扫描。覆盖索引可能完全避免访问数据页:

ON GL_JOURNAL_LOGS (JRNL_CD,SRC_CD,ACCT_IF_CD,JLOG_KEY,CASE_KEY,JRNL_AMT)

(您可能希望在该索引中首先具有最具选择性的谓词的列)

此外,您的查询可能能够有效利用索引

ON GL_JLOG_DETAILS (JLOG_KEY, TDTL_AMT) 

ON CASE_DATA (CASE_KEY, CONT_NO)

此外,请确保有关表和索引的统计信息是最新的。


此外,用于 OUTER JOIN 的 (+) 表示法可能会限制优化器。
Oracle 现在支持 ANSI 样式的连接,这可以让优化器在制定执行计划时有更大的自由度,例如

  FROM GL_Journal_Logs JLOG1
  LEFT
  JOIN GL_JLOG_Details VJLOG ON VJLOG.JLOG_KEY = JLOG1.JLOG_KEY
  LEFT
  JOIN CASE_DATA CASD ON CASD.CASE_KEY = JLOG1.CASE_KEY
 WHERE JLOG1.JRNL_CD = '0'
       AND JLOG1.SRC_CD = '2'
       AND JLOG1.ACCT_IF_CD = '0'
于 2012-07-10T21:49:23.353 回答