2

そのため、Oracle 11Gr2でのインデックスの適切な使用に問題があり、インデックスを適切に適用できるように、Explainプランがクエリにどのように関連付けられているかをよりよく理解しようとしています。次のクエリを実行する場合:

 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 に答える