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

Statické vs dynamické sql

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.



  1. Jak používat klauzuli Where v příkazu Select v SQL Server - SQL Server / Výukový program TSQL, část 109

  2. Jak vytvořit kontrolní omezení pro více sloupců na SQL Server - SQL Server / TSQL výukový program, část 84

  3. Mysql:Objednat podle like?

  4. Rozdíl mezi numerickou, plovoucí a desítkovou v SQL Server