Et MINUS er en sæt-operation, som udover at tage resultaterne af den anden forespørgsel væk fra den første, også vil fjerne dubletter, hvis de optræder i det første sæt. Som sådan vil den viste forespørgsel altid skulle bygge det fulde resultatsæt fra TABLE_1, før den returneres til brugeren.
Hvis du kan være sikker på, at der ikke er nogen dubletter for trimemd-hovedet/ikrafttrædelsesdatoen i det første sæt (eller du ikke vil have sådanne dubletter fjernet), kan du prøve
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) )
På den måde kan forespørgslen begynde at returnere resultater meget hurtigere, især hvis tabel_2 er meget lille, eller rækkerne kan tilgås via et indeks på effektiv_dato eller head.
PS. Hvis du kan, skal du fjerne RTRIM(LTRIM())-bittene.
PPS. Der er stadig ingen garanti for, at den vender tilbage på under 8 sekunder. Det vil afhænge af, hvor stor table_1 er, og indekser på type_of_action og/eller effektiv_dato.
Tilføjet:
Du kan markere
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)
og ignorer rækker, hvis det returneres
select 1 from table_2 b
where RTRIM(LTRIM(b.head)) = :1
and b.effective_date = :1
and rownum =1
Men det ville helt sikkert tage længere tid at udføre helt. Måske størrelsesordener længere (dvs. timer) afhængigt af hvor lang tid hver table_2 check tager. Ikke helt sikker på, hvilke kriterier der bruges til cutoff (varighed af opkald eller varighed af åben SQL-markør), så det kan lukke den ydre markør. Og afhængigt af størrelsen/indekset/indholdet af tabel_1, returnerer den ydre markør muligvis stadig ikke de første rækker inden for tidsrammen.
Hvor mange rækker i tabel_1, tabel_2 og hvilke indekser er tilgængelige?