Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

comparando dois cursores no oracle em vez de usar MINUS


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?