Připraveno k realizaci

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instanceazure Synapse Analytics

API ODBC definuje připravené provádění jako způsob, jak snížit režijní zátěž při parsování a kompilaci spojenou s opakovaným vykonáváním Transact-SQL příkazu. Aplikace vytvoří znakový řetězec obsahující SQL příkaz a poté jej vykoná ve dvou fázích. Jednou zavolá funkci SQLPrepare, aby byl příkaz parsován a zkompilován do plánu vykonání v Database Engine. Poté volá SQLExecute pro každé provedení připraveného plánu vykonání. To šetří náklady na parsování a kompilaci při každém provedení. Připravené vykonání se běžně používá v aplikacích k opakovanému provádění stejného, parametrizovaného SQL příkazu.

U většiny databází je připravené provedení rychlejší než přímé provedení u příkazů provedených více než třikrát nebo čtyřikrát, především proto, že příkaz je zkompilován pouze jednou, zatímco příkazy provedené přímo jsou kompilovány pokaždé, když jsou vykonány. Připravené vykonání může také snížit síťový provoz, protože ovladač může při každém spuštění příkazu odeslat identifikátor plánu vykonání a hodnoty parametrů místo celého SQL příkazu do zdroje.

SQL Server snižuje rozdíl ve výkonu mezi přímým a připraveným prováděním díky vylepšeným algoritmům pro detekci a opětovné využití plánů vykonání ze SQLExecDirect. To umožňuje některé výkonnostní výhody připraveného vykonávání přímo pro příkazy. Pro více informací viz Přímé provedení.

SQL Server také poskytuje nativní podporu pro připravené vykonání. Plán provádění je postaven na SQLPrepare a později vykonáván při volání SQLExecute . Protože SQL Server není povinen vytvářet dočasné uložené procedury v SQLPrepare, není v tempdb žádná další režie na systémové tabulky.

Z důvodu výkonu je příprava příkazu odložena, dokud není vyvoláno SQLExecute nebo není provedena operace metavlastností (například SQLDescribeCol nebo SQLDescribeParam v ODBC). Toto je výchozí chování. Případné chyby v připravovaném příkazu nejsou známy, dokud není příkaz vykonán nebo není provedena operace metavlastností. Nastavení atributu příkazu SQL Server Native Client ODBC na SQL_SOPT_SS_DEFER_PREPARE SQL_DP_OFF může toto výchozí chování vypnout.

V případě odložené přípravy vyvolání buď SQLDescribeCol nebo SQLDescribeParam před zavoláním SQLExecute, generuje další zpětnou cestu na server. Na SQLDescribeCol ovladač odstraní klauzuli WHERE z dotazu a pošle ji serveru s SET FMTONLY ON, aby získal popis sloupců v první sadě výsledků vrácených dotazem. Na SQLDescribeParam ovladač volá server, aby získal popis výrazů nebo sloupců odkazovaných libovolnými parametry v dotazu. Tato metoda má také některá omezení, například neschopnost vyřešit parametry v poddotazech.

Nadměrné používání SQLPrepare s ovladačem SQL Server Native Client ODBC snižuje výkon, zejména při připojení ke starším verzím SQL Server. Připravené spuštění by se nemělo používat pro příkazy spouštěné jednou. Připravené provedení je pomalejší než přímé provedení jednoho příkazu, protože vyžaduje další síťovou cestu zpět od klienta k serveru. Na starších verzích SQL Server také generuje dočasnou uloženou proceduru.

Připravené příkazy nelze použít k vytváření dočasných objektů na SQL Server.

Některé rané aplikace ODBC používaly SQLPrepare pokaždé, když byl použit SQLBindParameter . SQLBindParameter nevyžaduje použití SQLPrepare, lze jej použít se SQLExecDirect. Například použijte SQLExecDirect se SQLBindParameter k získání návratového kódu nebo výstupních parametrů z uložené procedury, která se vykoná pouze jednou. SQLPrepare nepoužívejte se SQLBindParameter, pokud nebude stejný příkaz vykonán opakovaně.