Oracle
 sql >> Database >  >> RDS >> Oracle

confrontando due cursori in Oracle invece di usare MENO

UN MENO è un'operazione sugli insiemi che, oltre a togliere i risultati della seconda query dalla prima, rimuoverà anche i duplicati se compaiono nel primo set. In quanto tale, la query mostrata dovrà sempre creare l'intero set di risultati da TABLE_1 prima di restituirlo all'utente.

Se puoi essere sicuro che non ci sono duplicati per la data di inizio/di validità del primo set (o non vuoi che tali duplicati vengano rimossi) puoi provare

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

In questo modo la query può iniziare a restituire risultati molto più rapidamente, specialmente se table_2 è molto piccola o se è possibile accedere alle righe tramite un indice su Effective_date o Head.

PS. Se possibile, rimuovere i bit RTRIM(LTRIM()).

PPS. Non c'è ancora alcuna garanzia che ritorni in meno di 8 secondi. Dipende da quanto è grande la tabella_1 e dagli indici su tipo_di_azione e/o data_effettiva.

Aggiunto:

Puoi scorrere

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)

e ignora le righe se sono state restituite

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

Ma ci vorrebbe sicuramente più tempo per essere eseguito completamente. Forse ordini di grandezza più lunghi (cioè ore) a seconda di quanto tempo impiega ogni controllo table_2. Non sono esattamente sicuro di quali criteri vengano utilizzati per il cutoff (durata della chiamata o durata del cursore SQL aperto), quindi potrebbe chiudere il cursore esterno. E a seconda della dimensione/indice/contenuto della tabella_1, il cursore esterno potrebbe comunque non restituire le prime righe entro l'intervallo di tempo.

Quante righe in table_1, table_2 e quali indici sono disponibili?