Oracle
 sql >> Base de données >  >> RDS >> Oracle

comparer deux curseurs dans oracle au lieu d'utiliser MINUS

Un MOINS est une opération d'ensemble qui, en plus de retirer les résultats de la deuxième requête de la première, supprimera également les doublons s'ils apparaissent dans le premier ensemble. Ainsi, la requête affichée devra toujours créer l'ensemble de résultats complet de TABLE_1 avant de le renvoyer à l'utilisateur.

Si vous pouvez être sûr qu'il n'y a pas de doublons pour la date de début/d'effet trimemd dans le premier ensemble (ou si vous ne voulez pas que ces doublons soient supprimés), vous pouvez essayer

SELECT  RTRIM(LTRIM(A.HEAD)), A.EFFECTIVE_DATE,
    FROM   TABLE_1 A
    WHERE  A.TYPE_OF_ACTION='6'
    AND    A.EFFECTIVE_DATE >= ADD_MONTHS(SYSDATE,-15)
    AND NOT EXISTS 
         (select 1 from table_2 b 
          where RTRIM(LTRIM(b.head)) = RTRIM(LTRIM(a.head))
          and b.effective_date = a.effective_date) )

De cette façon, la requête peut commencer à renvoyer des résultats beaucoup plus rapidement, surtout si table_2 est très petit ou si les lignes sont accessibles via un index sur effective_date ou head.

PS. Si vous le pouvez, supprimez les bits RTRIM(LTRIM()).

SPP. Il n'y a toujours aucune garantie qu'il reviendra en moins de 8 secondes. Cela dépend de la taille de table_1 et des index sur type_of_action et/ou effective_date.

Ajout :

Vous pouvez faire défiler

SELECT  RTRIM(LTRIM(A.HEAD)), A.EFFECTIVE_DATE,
    FROM   TABLE_1 A
    WHERE  A.TYPE_OF_ACTION='6'
    AND    A.EFFECTIVE_DATE >= ADD_MONTHS(SYSDATE,-15)

et ignorer les lignes si elles sont retournées

    select 1 from table_2 b 
      where RTRIM(LTRIM(b.head)) = :1
      and b.effective_date = :1
      and rownum =1

Mais cela prendrait certainement plus de temps à exécuter entièrement. Peut-être des ordres de grandeur plus longs (c'est-à-dire des heures) en fonction de la durée de chaque vérification table_2. Vous ne savez pas exactement quels critères sont utilisés pour la coupure (durée de l'appel ou durée du curseur SQL ouvert), il peut donc fermer le curseur externe. Et selon la taille/l'index/le contenu de table_1, le curseur externe peut toujours ne pas renvoyer les premières lignes dans le délai imparti.

Combien de lignes dans table_1, table_2 et quels index sont disponibles ?