sql >> Databáze >  >> RDS >> Oracle

Vnořený kurzor do kurzoru

Normálně byste se ke dvěma stolům připojili.

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

Protože se však obáváte o efektivitu

  • Je TEMP_TABLE opravdu dočasný stůl? Pokud ano, proč? Je velmi vzácné, že Oracle skutečně potřebuje používat dočasné tabulky, takže mě to vede k podezření, že pro naplnění dočasné tabulky pravděpodobně děláte něco neefektivního.
  • Proč máte kurzor FOR smyčka pro zpracování dat z TEMP_TABLE ? Zpracování řádků po řádcích je nejpomalejší způsob, jak v PL/SQL něco dělat, takže pokud máte obavy o efektivitu, obecně byste se mu měli vyhnout. Z hlediska výkonu chcete maximalizovat SQL tak, aby namísto provádění smyčky, která provedla sérii jednořádkových INSERT nebo UPDATE operace, udělali byste jediné INSERT nebo UPDATE který upravil celou sadu řádků. Pokud opravdu potřebujete zpracovávat data po kouscích, je to místo, kde by mohly hrát kolekce PL/SQL a hromadné zpracování, ale to nebude tak efektivní jako přímé SQL.
  • Proč máte DISTINCT ve vašem dotazu proti TEMP_TABLE ? Opravdu očekáváte, že bude duplicitní big_id hodnoty, které nejsou chybné? Lidé většinou používají DISTINCT nesprávně, ať už proto, abyste zakryli problémy, kdy byla data nesprávně připojena, nebo kde nutíte Oracle provádět drahé třídění pro případ, že by se v budoucnu vytvořila nesprávná data, kdy by omezení bylo vhodnější způsob, jak se chránit.


  1. Funkce MySQL COUNT nefunguje tak, jak bych chtěl, ve více spojených dotazech

  2. SQLite MAX

  3. Žádné mapování dialektu pro typ JDBC:2003

  4. Příkaz where v laravel rozlišuje velká a malá písmena