sql >> Databasteknik >  >> RDS >> Oracle

jämför två markörer i oracle istället för att använda MINUS

Ett MINUS är en uppsättningsoperation som, förutom att ta bort resultaten från den andra frågan från den första, även tar bort dubbletter om de förekommer i den första uppsättningen. Som sådan måste frågan som visas alltid bygga hela resultatuppsättningen från TABLE_1 innan den returneras till användaren.

Om du kan vara säker på att det inte finns några dubbletter för trimemd-huvudet/ikraftträdandedatumet i den första uppsättningen (eller om du inte vill att sådana dubbletter tas bort) kan du försöka

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å så sätt kan frågan börja ge resultat mycket snabbare, särskilt om tabell_2 är mycket liten eller om raderna kan nås via ett index på effect_date eller head.

PS. Om du kan, ta bort RTRIM(LTRIM())-bitarna.

PPS. Det finns fortfarande ingen garanti för att den kommer tillbaka inom 8 sekunder. Det beror på hur stor table_1 är, och index på typ_of_action och/eller effektiv_datum.

Lade till:

Du kan bläddra igenom

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)

och ignorera rader om det returneras

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

Men det skulle säkert ta längre tid att genomföra helt. Kanske storleksordningar längre (dvs. timmar) beroende på hur lång tid varje table_2-kontroll tar. Inte riktigt säker på vilka kriterier som används för cutoff (varaktighet för anrop eller varaktighet för öppen SQL-markör), så det kan stänga den yttre markören. Och beroende på storleken/indexet/innehållet i table_1, kanske den yttre markören fortfarande inte returnerar de första raderna inom tidsramen.

Hur många rader i tabell_1, tabell_2 och vilka index är tillgängliga?



  1. Liknande UTF-8-strängar för autokompletteringsfält

  2. PL/SQL FTP API binärt vs ascii-läge

  3. Infoga data i mysql kolumn med mellanslag med php

  4. mysql-kommandot osynkroniserat när man kör insert från selleri