Ett MINUS är en uppsättningsoperation som, förutom att ta bort resultaten från den andra frågan från den första, även tar bort dubbletter om de förekommer i den första uppsättningen. Som sådan måste frågan som visas alltid bygga hela resultatuppsättningen från TABLE_1 innan den returneras till användaren.
Om du kan vara säker på att det inte finns några dubbletter för trimemd-huvudet/ikraftträdandedatumet i den första uppsättningen (eller om du inte vill att sådana dubbletter tas bort) kan du försöka
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å så sätt kan frågan börja ge resultat mycket snabbare, särskilt om tabell_2 är mycket liten eller om raderna kan nås via ett index på effect_date eller head.
PS. Om du kan, ta bort RTRIM(LTRIM())-bitarna.
PPS. Det finns fortfarande ingen garanti för att den kommer tillbaka inom 8 sekunder. Det beror på hur stor table_1 är, och index på typ_of_action och/eller effektiv_datum.
Lade till:
Du kan bläddra igenom
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)
och ignorera rader om det returneras
select 1 from table_2 b
where RTRIM(LTRIM(b.head)) = :1
and b.effective_date = :1
and rownum =1
Men det skulle säkert ta längre tid att genomföra helt. Kanske storleksordningar längre (dvs. timmar) beroende på hur lång tid varje table_2-kontroll tar. Inte riktigt säker på vilka kriterier som används för cutoff (varaktighet för anrop eller varaktighet för öppen SQL-markör), så det kan stänga den yttre markören. Och beroende på storleken/indexet/innehållet i table_1, kanske den yttre markören fortfarande inte returnerar de första raderna inom tidsramen.
Hur många rader i tabell_1, tabell_2 och vilka index är tillgängliga?