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

Zagnieżdżony kursor w kursorze

Normalnie po prostu dołączyłbyś do dwóch stołów.

FOR some_cursor IN (SELECT s.col1,
                           s.col2
                      FROM sometable s
                           JOIN temp_table t ON (s.col3 = t.col1))
LOOP
  <<do something>>
END LOOP

Ponieważ jednak martwisz się o wydajność

  • Czy TEMP_TABLE naprawdę tymczasowy stół? Jeśli tak, dlaczego? Niezwykle rzadko zdarza się, aby Oracle faktycznie używało tabel tymczasowych, więc podejrzewam, że prawdopodobnie robisz coś nieefektywnego, aby zapełnić tabelę tymczasową.
  • Dlaczego masz kursor FOR pętla do przetwarzania danych z TEMP_TABLE ? Przetwarzanie wiersz po wierszu to najwolniejszy sposób na zrobienie czegokolwiek w PL/SQL, więc generalnie można by tego uniknąć, jeśli martwisz się o wydajność. Z punktu widzenia wydajności, chcesz zmaksymalizować SQL, aby zamiast robić pętlę, która wykonała serię jednowierszowych INSERT lub UPDATE operacje, zrobiłbyś jedną INSERT lub UPDATE które zmodyfikowały cały zestaw wierszy. Jeśli naprawdę potrzebujesz przetwarzać dane w kawałkach, w grę wchodzą kolekcje PL/SQL i przetwarzanie zbiorcze, ale nie będzie to tak wydajne, jak prosty SQL.
  • Dlaczego masz DISTINCT w zapytaniu względem TEMP_TABLE ? Czy naprawdę spodziewasz się, że będzie duplikat big_id? wartości, które nie są błędne? Przez większość czasu ludzie używają DISTINCT niepoprawnie albo w celu zatuszowania problemów, w których dane zostały nieprawidłowo połączone, albo gdy zmuszasz Oracle do kosztownego sortowania na wypadek, gdyby nieprawidłowe dane zostały utworzone w przyszłości, gdy ograniczenie byłoby bardziej odpowiednim sposobem ochrony.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego Oracle.ManagedDataAccess nie działa, gdy działa Oracle.DataAccess?

  2. Usuń losowe wyrażenie z ciągu

  3. Oracle odczytuje nazwy kolumn z instrukcji select

  4. Oracle JDBC DriverManager.getConnection() zawiesza się

  5. Uruchom, aby sprawdzić duplikaty