sql >> Databáze >  >> RDS >> Oracle

porovnání dvou kurzorů v oracle místo použití MINUS

MÍNUS je operace sady, která kromě toho, že odebere výsledky druhého dotazu od prvního, také odstraní duplikáty, pokud se objeví v první sadě. Zobrazený dotaz jako takový bude muset vždy vytvořit úplnou sadu výsledků. z TABLE_1, než jej vrátíte uživateli.

Pokud si můžete být jisti, že pro trimovanou hlavu/datum účinnosti v první sadě nejsou žádné duplikáty (nebo nechcete, aby byly takové duplikáty odstraněny), můžete to zkusit

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

Tímto způsobem může dotaz začít vracet výsledky mnohem rychleji, zvláště pokud je tabulka_2 velmi malá nebo je možné k řádkům přistupovat prostřednictvím indexu v datum_účinnosti nebo záhlaví.

PS. Pokud můžete, odeberte bity RTRIM(LTRIM()).

PPS. Stále neexistuje žádná záruka, že se vrátí do 8 sekund. To by záleželo na tom, jak velká je tabulka_1 a indexy na typu_akce a/nebo na datu účinnosti.

Přidáno:

Můžete kurzorem přejít přes

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)

a ignorovat řádky, pokud se vrátí

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

Úplné provedení by ale určitě trvalo déle. Možná řádově déle (tj. hodiny) v závislosti na tom, jak dlouho trvá každá kontrola tabulky_2. Nejste si přesně jisti, jaká kritéria se používají pro cutoff (doba trvání volání nebo trvání otevřeného SQL kurzoru), takže může dojít k uzavření vnějšího kurzoru. A v závislosti na velikosti/indexu/obsahu tabulky_1 nemusí vnější kurzor v daném časovém rámci vrátit první řádky.

Kolik řádků v table_1, table_2 a jaké indexy jsou k dispozici?



  1. JOINy ​​s podmínkou v dotazu HQL?

  2. Jak nahrát více obrázků v laravel

  3. SQL dotaz pro stromovou tabulku

  4. Nahraďte CHAR za VARCHAR2