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_TABLEdavvero 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
FORloop per elaborare i dati daTEMP_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 diINSERTa riga singola oUPDATEoperazioni, faresti un singoloINSERToUPDATEche 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
DISTINCTnella tua query suTEMP_TABLE? Ti aspetti davvero che ci sarannobig_idduplicati valori che non sono errati? La maggior parte delle volte, le persone usanoDISTINCTin 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.