Um MENOS é uma operação de conjunto que, além de retirar os resultados da segunda consulta da primeira, também removerá duplicatas se elas aparecerem no primeiro conjunto. Dessa forma, a consulta mostrada sempre terá que construir o conjunto de resultados completo da TABLE_1 antes de devolvê-la ao usuário.
Se você pode ter certeza de que não há duplicatas para o trimemd head/data efetiva no primeiro conjunto (ou você não deseja que essas duplicatas sejam removidas), você pode tentar
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) )
Dessa forma, a consulta pode começar a retornar resultados muito mais rapidamente, especialmente se table_2 for muito pequeno ou as linhas puderem ser acessadas por meio de um índice em Effective_date ou head.
PS. Se puder, remova os bits RTRIM(LTRIM()).
PPS. Ainda não há garantia de que ele retornará em menos de 8 segundos. Isso dependeria do tamanho da tabela_1 e dos índices em type_of_action e/ou Effective_date.
Adicionado:
Você poderia passar o cursor
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)
e ignore as linhas se ele retornou
select 1 from table_2 b
where RTRIM(LTRIM(b.head)) = :1
and b.effective_date = :1
and rownum =1
Mas certamente levaria mais tempo para executar inteiramente. Talvez ordens de magnitude mais longas (ou seja, horas), dependendo de quanto tempo cada verificação table_2 leva. Não tenho certeza de quais critérios são usados para o corte (duração da chamada ou duração do cursor SQL aberto), então pode fechar o cursor externo. E dependendo do tamanho/índice/conteúdo da tabela_1, o cursor externo ainda pode não retornar as primeiras linhas dentro do prazo.
Quantas linhas em table_1, table_2 e quais índices estão disponíveis?