sql >> Database teknologi >  >> RDS >> Oracle

sammenligne to markører i oracle i stedet for at bruge MINUS

Et MINUS er en sæt-operation, som udover at tage resultaterne af den anden forespørgsel væk fra den første, også vil fjerne dubletter, hvis de optræder i det første sæt. Som sådan vil den viste forespørgsel altid skulle bygge det fulde resultatsæt fra TABLE_1, før den returneres til brugeren.

Hvis du kan være sikker på, at der ikke er nogen dubletter for trimemd-hovedet/ikrafttrædelsesdatoen i det første sæt (eller du ikke vil have sådanne dubletter fjernet), kan du prøve

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

På den måde kan forespørgslen begynde at returnere resultater meget hurtigere, især hvis tabel_2 er meget lille, eller rækkerne kan tilgås via et indeks på effektiv_dato eller head.

PS. Hvis du kan, skal du fjerne RTRIM(LTRIM())-bittene.

PPS. Der er stadig ingen garanti for, at den vender tilbage på under 8 sekunder. Det vil afhænge af, hvor stor table_1 er, og indekser på type_of_action og/eller effektiv_dato.

Tilføjet:

Du kan markere

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)

og ignorer rækker, hvis det returneres

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

Men det ville helt sikkert tage længere tid at udføre helt. Måske størrelsesordener længere (dvs. timer) afhængigt af hvor lang tid hver table_2 check tager. Ikke helt sikker på, hvilke kriterier der bruges til cutoff (varighed af opkald eller varighed af åben SQL-markør), så det kan lukke den ydre markør. Og afhængigt af størrelsen/indekset/indholdet af tabel_1, returnerer den ydre markør muligvis stadig ikke de første rækker inden for tidsrammen.

Hvor mange rækker i tabel_1, tabel_2 og hvilke indekser er tilgængelige?



  1. Implementering af PostgreSQL på en Docker-container

  2. Varchar til talkonvertering til sortering

  3. SQL:Find den længste fælles streng mellem rækker

  4. Hvordan fjerner man foranstillede nuller fra dag- og månedsværdier i Oracle, når man parser til streng ved hjælp af to_char-funktionen?