Oracle
 sql >> Baza danych >  >> RDS >> Oracle

porównywanie dwóch kursorów w Oracle zamiast używania MINUS

MINUS to operacja na zbiorze, która oprócz oddzielenia wyników drugiego zapytania od pierwszego, usunie również duplikaty, jeśli pojawią się w pierwszym zestawie. z TABLE_1 przed zwróceniem go użytkownikowi.

Jeśli masz pewność, że nie ma duplikatów dla przyciętej głowy/daty wejścia w życie w pierwszym zestawie (lub nie chcesz, aby takie duplikaty zostały usunięte), możesz spróbować

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

W ten sposób zapytanie może zacząć zwracać wyniki znacznie szybciej, zwłaszcza jeśli table_2 jest bardzo mała lub do wierszy można uzyskać dostęp za pośrednictwem indeksu z datą_efektywną lub nagłówkiem.

PS. Jeśli możesz, usuń bity RTRIM(LTRIM()).

PPS. Nadal nie ma gwarancji, że powróci w mniej niż 8 sekund. Zależyłoby to od wielkości table_1 i indeksów typu type_of_action i/lub effect_date.

Dodano:

Możesz przejrzeć

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)

i ignoruj ​​wiersze, jeśli zwrócona

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

Ale z pewnością wykonanie całości zajęłoby więcej czasu. Może o rzędy wielkości dłużej (tj. godziny) w zależności od tego, jak długo trwa każde sprawdzenie table_2. Nie do końca pewien, jakie kryteria są używane do odcięcia (czas trwania połączenia lub czas trwania otwartego kursora SQL), więc może zamknąć zewnętrzny kursor. W zależności od rozmiaru/indeksu/zawartości tabeli_1, zewnętrzny kursor może nadal nie zwracać pierwszych wierszy w ramach czasowych.

Ile wierszy w tabela_1, table_2 i jakie indeksy są dostępne?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Baza danych Oracle wisi w nieskończoność w zapytaniach UPDATE

  2. Jak połączyć się z serwerem LDAP za pomocą node-oracledb?

  3. Zapobieganie wstrzykiwaniu SQL za pomocą dynamicznego zapytania SQL ALTER USER

  4. Konwertuj zapytanie Oracle SQL na zapytanie Azure SQL

  5. warunkowe przyłączenie w wyroczni