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?