sql >> Databasteknik >  >> RDS >> Oracle

Kapslad markör i en markör

Normalt skulle du bara gå med i de två borden.

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

Eftersom du är orolig för effektivitet, dock

  • Är TEMP_TABLE verkligen ett tillfälligt bord? Om så är fallet, varför? Det är ytterst sällsynt att Oracle faktiskt behöver använda temporära tabeller så det får mig att misstänka att du förmodligen gör något ineffektivt för att fylla i den temporära tabellen i första hand.
  • Varför har du en markör FOR loop för att bearbeta data från TEMP_TABLE ? Rad-för-rad-bearbetning är det långsammaste sättet att göra något i PL/SQL så det skulle i allmänhet undvikas om du är orolig för effektivitet. Ur prestandasynpunkt vill du maximera SQL så att istället för att göra en slinga som gjorde en rad enrads INSERT eller UPDATE operationer skulle du göra en enda INSERT eller UPDATE som modifierade en hel uppsättning rader. Om du verkligen behöver bearbeta data i bitar, är det där PL/SQL-samlingar och bulkbearbetning kommer att spela in, men det kommer inte att vara lika effektivt som rak SQL.
  • Varför har du DISTINCT i din fråga mot TEMP_TABLE ? Förväntar du dig verkligen att det kommer att finnas dubbletter av big_id värderingar som inte är felaktiga? För det mesta använder folk DISTINCT felaktigt antingen för att dölja problem där data har sammanfogats felaktigt eller där du tvingar Oracle att göra en dyr sortering ifall felaktig data skapas i framtiden när en begränsning skulle vara det lämpligaste sättet att skydda dig själv.


  1. Oracle REGEXP_LIKE och ordgränser

  2. Lägg till egenskap till objekt som returneras av Sequelize FindOne

  3. Hitta värden som inte innehåller siffror i SQLite

  4. MySQL - Pulling List beroende på datum och kategori