MÍNUS je operace sady, která kromě toho, že odebere výsledky druhého dotazu od prvního, také odstraní duplikáty, pokud se objeví v první sadě. Zobrazený dotaz jako takový bude muset vždy vytvořit úplnou sadu výsledků. z TABLE_1, než jej vrátíte uživateli.
Pokud si můžete být jisti, že pro trimovanou hlavu/datum účinnosti v první sadě nejsou žádné duplikáty (nebo nechcete, aby byly takové duplikáty odstraněny), můžete to zkusit
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) )
Tímto způsobem může dotaz začít vracet výsledky mnohem rychleji, zvláště pokud je tabulka_2 velmi malá nebo je možné k řádkům přistupovat prostřednictvím indexu v datum_účinnosti nebo záhlaví.
PS. Pokud můžete, odeberte bity RTRIM(LTRIM()).
PPS. Stále neexistuje žádná záruka, že se vrátí do 8 sekund. To by záleželo na tom, jak velká je tabulka_1 a indexy na typu_akce a/nebo na datu účinnosti.
Přidáno:
Můžete kurzorem přejít přes
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)
a ignorovat řádky, pokud se vrátí
select 1 from table_2 b
where RTRIM(LTRIM(b.head)) = :1
and b.effective_date = :1
and rownum =1
Úplné provedení by ale určitě trvalo déle. Možná řádově déle (tj. hodiny) v závislosti na tom, jak dlouho trvá každá kontrola tabulky_2. Nejste si přesně jisti, jaká kritéria se používají pro cutoff (doba trvání volání nebo trvání otevřeného SQL kurzoru), takže může dojít k uzavření vnějšího kurzoru. A v závislosti na velikosti/indexu/obsahu tabulky_1 nemusí vnější kurzor v daném časovém rámci vrátit první řádky.
Kolik řádků v table_1, table_2 a jaké indexy jsou k dispozici?