МИНУС - это заданная операция, которая, так же как и удаление результатов второго запроса от первого, также удалит дубликаты, если они появятся в первом наборе.
Таким образом, показанный запрос всегда должен будет построить полный набор результатов из TABLE_1, прежде чем возвращать его пользователю.
Если вы можете быть уверены, что в первом наборе нет дубликатов заголовка / даты вступления в силу (или вы не хотите, чтобы такие дубликаты были удалены), вы можете попробовать
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) )
Таким образом, запрос может начать возвращать результаты намного быстрее, особенно если table_2 очень мал или доступ к строкам возможен через индекс эффективное_даты или заголовок.
PS. Если вы можете, удалите биты RTRIM (LTRIM ()).
PPS. Там все еще нет гарантии, что он вернется менее чем за 8 секунд. Это будет зависеть от того, насколько большой table_1, и индексов для type_of_action и / илиffective_date.
Добавлено:
Вы можете навести курсор на
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)
и игнорировать строки, если он вернул
select 1 from table_2 b
where RTRIM(LTRIM(b.head)) = :1
and b.effective_date = :1
and rownum =1
Но, безусловно, потребуется больше времени, чтобы полностью выполнить. Возможно, на несколько порядков больше (т. Е. Часов), в зависимости от того, сколько времени занимает проверка table_2. Не совсем точно, какие критерии используются для обрезания (длительность вызова или длительность открытого курсора SQL), поэтому он может закрыть внешний курсор. И в зависимости от размера / индекса / содержимого таблицы_1 внешний курсор может все еще не возвращать первые строки в пределах таймфрейма.
Сколько строк в table_1, table_2 и какие индексы доступны?