sql >> Base de Datos >  >> RDS >> Oracle

comparando dos cursores en Oracle en lugar de usar MENOS

Un MENOS es una operación de conjunto que, además de quitar los resultados de la segunda consulta de la primera, también eliminará los duplicados si aparecen en el primer conjunto. Como tal, la consulta mostrada siempre tendrá que generar el conjunto de resultados completo. de TABLE_1 antes de devolverlo al usuario.

Si puede estar seguro de que no hay duplicados para el encabezado trimemd/fecha de vigencia en el primer conjunto (o si no desea que se eliminen dichos duplicados), puede intentar

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) )

De esa manera, la consulta puede comenzar a arrojar resultados mucho más rápido, especialmente si la tabla_2 es ​​muy pequeña o se puede acceder a las filas a través de un índice en fecha_efectiva o encabezado.

PD. Si puede, elimine los bits RTRIM(LTRIM()).

PPS. Todavía no hay garantía de que regrese en menos de 8 segundos. Eso dependería del tamaño de la tabla_1 y de los índices en tipo_de_acción y/o fecha_efectiva.

Añadido:

Podrías pasar el cursor por

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 ignorar las filas si regresa

    select 1 from table_2 b 
      where RTRIM(LTRIM(b.head)) = :1
      and b.effective_date = :1
      and rownum =1

Pero ciertamente tomaría más tiempo ejecutarlo por completo. Tal vez órdenes de magnitud más largos (es decir, horas) dependiendo de cuánto tiempo lleve cada verificación de table_2. No estoy exactamente seguro de qué criterio se usa para el corte (duración de la llamada o duración del cursor SQL abierto), por lo que podría cerrar el cursor externo. Y dependiendo del tamaño/índice/contenido de table_1, es posible que el cursor externo aún no devuelva las primeras filas dentro del período de tiempo.

¿Cuántas filas en table_1, table_2 y qué índices están disponibles?