Váš ukázkový kód je tak jednoduchý, že v něm bude malý rozdíl, ale v takovém případě by se statická verze s největší pravděpodobností lépe prováděla.
Hlavním důvodem použití dynamického SQL pro výkon je situace, kdy se příkaz SQL může výrazně lišit – tj. můžete být schopni přidat další kód do klauzule WHERE za běhu na základě stavu systému (omezení dílčím dotazem na adrese, je-li zadána adresa atd.).
Dalším důvodem je, že někdy použití proměnných Bind jako parametrů může být kontraproduktivní.
Příkladem je situace, kdy máte něco jako stavové pole, kde data nejsou rovnoměrně rozložena (ale jsou indexována).
Zvažte následující 3 tvrzení, když 95 % dat je „P'zpracováno
SELECT col FROM table
WHERE status = 'U'-- unprocessed
AND company = :company
SELECT col FROM table
WHERE status = 'P' -- processed
AND company = :company
SELECT col FROM table
WHERE status = :status
AND company = :company
V konečné verzi Oracle zvolí obecný plán vysvětlení. V první verzi se může rozhodnout, že nejlepším plánem je začít s indexem stavu (s vědomím, že „nezpracované položky tvoří velmi malou část celkového počtu).
Můžete to implementovat pomocí různých statických příkazů, ale tam, kde máte složitější příkazy, které se mění pouze o několik znaků, může být lepší volbou dynamické SQL.
Nevýhody
Každé opakování stejného dynamického příkazu SQL znamená měkkou analýzu, což je ve srovnání se statickým příkazem malá režie, ale stále je to režie.
Každý NOVÝ příkaz SQL (dynamický nebo statický) také zablokuje SGA (sdílená paměť) a může vést k vytlačení „starých“ příkazů.
Špatný, ale běžný návrh systému je, že někdo používá dynamické SQL ke generování jednoduchých výběrů, které se liší pouze podle klíče – tj.
SELECT col FROM table WHERE id = 5
SELECT col FROM table WHERE id = 20
SELECT col FROM table WHERE id = 7
Jednotlivé příkazy budou rychlé, ale celkový výkon systému se zhorší, protože zabíjí sdílené zdroje.
Také – s dynamickým SQL je mnohem těžší zachytit chyby v době kompilace. Pokud používáte PL/SQL, zahazujete dobrou kontrolu času kompilace. I když používáte něco jako JDBC (kde přesouváte veškerý kód databáze do řetězců – dobrý nápad!), můžete získat předanalyzátory pro ověření obsahu JDBC. Dynamické SQL =pouze testování za běhu.
Režie
Režie okamžitého provedení je malá - pohybuje se v tisícinách sekundy - může se však sčítat, pokud je to uvnitř smyčky / u metody volané jednou na objekt / atd. Jednou jsem dosáhl 10násobného zlepšení rychlosti nahrazením dynamické SQL s vygenerovaným statickým SQL. To však zkomplikovalo kód a bylo to provedeno pouze proto, že jsme požadovali rychlost.