Oracle
 sql >> Base de données >  >> RDS >> Oracle

Curseur imbriqué dans un curseur

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 de TEMP_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 de INSERT sur une seule ligne ou UPDATE opérations, vous feriez un seul INSERT ou UPDATE 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 sur TEMP_TABLE ? Vous attendez-vous vraiment à ce qu'il y ait un doublon big_id des valeurs qui ne sont pas erronées ? La plupart du temps, les gens utilisent DISTINCT 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.