MINUS to operacja na zbiorze, która oprócz oddzielenia wyników drugiego zapytania od pierwszego, usunie również duplikaty, jeśli pojawią się w pierwszym zestawie. z TABLE_1 przed zwróceniem go użytkownikowi.
Jeśli masz pewność, że nie ma duplikatów dla przyciętej głowy/daty wejścia w życie w pierwszym zestawie (lub nie chcesz, aby takie duplikaty zostały usunięte), możesz spróbować
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) )
W ten sposób zapytanie może zacząć zwracać wyniki znacznie szybciej, zwłaszcza jeśli table_2 jest bardzo mała lub do wierszy można uzyskać dostęp za pośrednictwem indeksu z datą_efektywną lub nagłówkiem.
PS. Jeśli możesz, usuń bity RTRIM(LTRIM()).
PPS. Nadal nie ma gwarancji, że powróci w mniej niż 8 sekund. Zależyłoby to od wielkości table_1 i indeksów typu type_of_action i/lub effect_date.
Dodano:
Możesz przejrzeć
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)
i ignoruj wiersze, jeśli zwrócona
select 1 from table_2 b
where RTRIM(LTRIM(b.head)) = :1
and b.effective_date = :1
and rownum =1
Ale z pewnością wykonanie całości zajęłoby więcej czasu. Może o rzędy wielkości dłużej (tj. godziny) w zależności od tego, jak długo trwa każde sprawdzenie table_2. Nie do końca pewien, jakie kryteria są używane do odcięcia (czas trwania połączenia lub czas trwania otwartego kursora SQL), więc może zamknąć zewnętrzny kursor. W zależności od rozmiaru/indeksu/zawartości tabeli_1, zewnętrzny kursor może nadal nie zwracać pierwszych wierszy w ramach czasowych.
Ile wierszy w tabela_1, table_2 i jakie indeksy są dostępne?