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

Cursore annidato in un cursore

Normalmente, ti uniresti ai due tavoli.

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

Dal momento che sei preoccupato per l'efficienza, tuttavia

  • È TEMP_TABLE davvero un tavolo temporaneo? Se sì, perché? È estremamente raro che Oracle abbia effettivamente bisogno di utilizzare tabelle temporanee, quindi questo mi porta a sospettare che tu stia probabilmente facendo qualcosa di inefficiente per popolare la tabella temporanea in primo luogo.
  • Perché hai un cursore FOR loop per elaborare i dati da TEMP_TABLE ? L'elaborazione riga per riga è il modo più lento per eseguire qualsiasi operazione in PL/SQL, quindi sarebbe generalmente evitata se si è preoccupati per l'efficienza. Dal punto di vista delle prestazioni, vuoi massimizzare l'SQL in modo che invece di eseguire un ciclo che ha eseguito una serie di INSERT a riga singola o UPDATE operazioni, faresti un singolo INSERT o UPDATE che ha modificato un intero set di righe. Se hai davvero bisogno di elaborare i dati in blocchi, è qui che entrano in gioco le raccolte PL/SQL e l'elaborazione in blocco, ma non sarà efficiente quanto l'SQL semplice.
  • Perché hai il DISTINCT nella tua query su TEMP_TABLE ? Ti aspetti davvero che ci saranno big_id duplicati valori che non sono errati? La maggior parte delle volte, le persone usano DISTINCT in modo errato per coprire problemi in cui i dati sono stati uniti in modo errato o in cui stai costringendo Oracle a eseguire un ordinamento costoso nel caso in cui vengano creati dati errati in futuro quando un vincolo sarebbe il modo più appropriato per proteggerti.