Sdílet prostřednictvím


Dynamický výkon SQL v rozhraní ODBC

I když statický SQL funguje dobře v mnoha situacích, existuje třída aplikací, ve kterých nelze předem určit přístup k datům. Předpokládejme například, že tabulka umožňuje uživateli zadat dotaz, který pak odešle do DBMS, aby načetl data. Obsah tohoto dotazu samozřejmě nelze při zápisu tabulkového programu znát programátorům.

Dynamické provádění

K vyřešení tohoto problému tabulka používá formu vloženého SQL označovaného jako dynamický SQL. Na rozdíl od statických příkazů SQL, které jsou pevně zakódované v programu, lze dynamické příkazy SQL sestavit za běhu a umístit do proměnné hostitele řetězce. Pak se odešlou do DBMS ke zpracování. Vzhledem k tomu, že DBMS musí vygenerovat plán přístupu za běhu pro dynamické příkazy SQL, je dynamické SQL obecně pomalejší než statické SQL. Pokud je zkompilován program obsahující dynamické příkazy SQL, dynamické příkazy SQL se z programu neodebraly, stejně jako ve statickém SQL. Místo toho jsou nahrazeny voláním funkce, která předává příkaz do DBMS; statické příkazy SQL ve stejném programu se zpracovávají normálně.

Nejjednodušší způsob, jak spustit dynamický příkaz SQL, je příkaz EXECUTE IMMEDIATE. Tento příkaz předá příkaz SQL dbMS pro kompilaci a spuštění.

Nevýhodou příkazu EXECUTE IMMEDIATE je, že DBMS musí projít všemi pěti kroky zpracování příkazu SQL při každém spuštění příkazu. Režie spojená s tímto procesem může být významná, pokud se dynamicky spouští mnoho příkazů, a pokud jsou tyto příkazy podobné, se plýtvá.

Připravené spuštění

K vyřešení výše uvedené situace nabízí dynamický SQL optimalizovanou formu provádění označovanou jako připravené spuštění, která používá následující kroky:

  1. Program vytvoří příkaz SQL ve vyrovnávací paměti, stejně jako to dělá pro příkaz EXECUTE IMMEDIATE. Místo proměnných hostitele lze otazník (?) nahradit konstantou kdekoli v textu příkazu, aby bylo možné zadat hodnotu konstanty později. Otazník se nazývá jako značka parametru.

  2. Program předá příkaz SQL do DBMS příkazEM PREPARE, který požaduje, aby DBMS parsoval, ověřoval a optimalizoval příkaz a vygeneroval pro něj plán provádění. Program pak použije příkaz EXECUTE (nikoli příkaz EXECUTE IMMEDIATE) k pozdějšímu spuštění příkazu PREPARE. Předává hodnoty parametrů pro příkaz prostřednictvím speciální datové struktury označované jako SQL Data Area nebo SQLDA.

  3. Program může opakovaně používat příkaz EXECUTE a při každém spuštění dynamického příkazu zadat různé hodnoty parametrů.

Připravené spuštění stále není stejné jako statické SQL. Ve statickém SQL se první čtyři kroky zpracování příkazu SQL provádí v době kompilace. V připraveném provedení se tyto kroky pořád provádějí za běhu, ale provádějí se jenom jednou. Provádění plánu probíhá pouze při volání EXECUTE. Toto chování pomáhá eliminovat některé nevýhody výkonu, které jsou součástí architektury dynamického SQL.

Viz také

EXECUTE (Transact-SQL)
sp_executesql (Transact-SQL)