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 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 diINSERT
a riga singola oUPDATE
operazioni, faresti un singoloINSERT
oUPDATE
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 suTEMP_TABLE
? Ti aspetti davvero che ci sarannobig_id
duplicati valori che non sono errati? La maggior parte delle volte, le persone usanoDISTINCT
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.