Normalement, vous ne feriez que joindre les deux tables.
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
Cependant, puisque vous vous souciez de l'efficacité
- Est
TEMP_TABLE
vraiment une table temporaire? Si oui, pourquoi? Il est extrêmement rare qu'Oracle ait réellement besoin d'utiliser des tables temporaires, ce qui m'amène à penser que vous faites probablement quelque chose d'inefficace pour remplir la table temporaire en premier lieu. - Pourquoi avez-vous un curseur
FOR
boucle pour traiter les données deTEMP_TABLE
? Le traitement ligne par ligne est le moyen le plus lent de faire quoi que ce soit en PL/SQL, il est donc généralement évité si vous êtes soucieux de l'efficacité. Du point de vue des performances, vous souhaitez maximiser SQL afin que plutôt que de faire une boucle qui a fait une série deINSERT
sur une seule ligne ouUPDATE
opérations, vous feriez un seulINSERT
ouUPDATE
qui a modifié un ensemble entier de lignes. Si vous avez vraiment besoin de traiter des données par blocs, c'est là que les collections PL/SQL et le traitement en bloc entreraient en jeu, mais cela ne sera pas aussi efficace que le SQL simple. - Pourquoi avez-vous le
DISTINCT
dans votre requête surTEMP_TABLE
? Vous attendez-vous vraiment à ce qu'il y ait un doublonbig_id
des valeurs qui ne sont pas erronées ? La plupart du temps, les gens utilisentDISTINCT
incorrectement soit pour couvrir les problèmes où les données ont été jointes de manière incorrecte, soit pour forcer Oracle à effectuer un tri coûteux au cas où des données incorrectes seraient créées à l'avenir alors qu'une contrainte serait le moyen le plus approprié de vous protéger.