2 votes

Index Oracle sur les jointures externes gauches

J'ai quelques problèmes avec l'utilisation correcte des index dans Oracle 11Gr2 et j'essaie de mieux comprendre comment mon plan d'explication est lié à ma requête afin de pouvoir appliquer l'indexation correctement. Lors de l'exécution de la requête suivante :

 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));

J'obtiens les détails d'explication suivants : enter image description here

Je peux comprendre que les index sur mes " clés " de jointure (JLOG_KEY ou CASE_KEY) ne s'appliqueraient pas nécessairement puisqu'il s'agit d'une jointure externe (ou devraient-ils le faire ?), mais lorsque je crée des index sur JLOG1 (JRNL_CD, SRC_CD, ACCT_IF_CD), techniquement, ceux-ci prendraient-ils effet étant donné ma clause " where " ?

Dois-je créer des index dans ces circonstances ou existe-t-il une meilleure façon de procéder ?

2voto

spencer7593 Points 29263

Selon la cardinalité des colonnes de vos prédicats, un index approprié peut être utilisé sur la table GL_JLOG_DETAILS, évitant ainsi un balayage complet de la table. Un index de recouvrement peut éviter tout accès aux pages de données :

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

(Vous voulez probablement que la colonne avec le prédicat le plus sélectif soit la première dans cet index).

De plus, votre requête peut utiliser efficacement les index.

ON GL_JLOG_DETAILS (JLOG_KEY, TDTL_AMT) 

et

ON CASE_DATA (CASE_KEY, CONT_NO)

Assurez-vous également que les statistiques sur les tables et les index sont à jour.


En outre, la notation (+) pour un OUTER JOIN peut limiter l'optimiseur.
Oracle prend désormais en charge les jointures de style ANSI, ce qui permet à l'optimiseur d'avoir plus de latitude dans l'élaboration d'un plan d'exécution, par ex.

  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'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X