Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
De ODBC API definieert prepared execution als een manier om de overhead voor parsing en compileren te verminderen die gepaard gaat met het herhaaldelijk uitvoeren van een Transact-SQL-instructie. De applicatie bouwt een tekenreeks met een SQL-instructie en voert deze vervolgens in twee fasen uit. Het roept de SQLPrepare-functie één keer aan om de instructie te laten parsen en te compileren tot een uitvoeringsplan door de Database Engine. Vervolgens roept het SQLExecute aan voor elke uitvoering van het voorbereide uitvoeringsplan. Dit bespaart de parsing en compilatie-overhead bij elke uitvoering. Voorbereide uitvoering wordt vaak door applicaties gebruikt om steeds dezelfde geparametriseerde SQL-instructie uit te voeren.
Voor de meeste databases is voorbereide uitvoering sneller dan directe uitvoering voor statements die meer dan drie of vier keer worden uitgevoerd, voornamelijk omdat de instructie slechts één keer wordt gecompileerd, terwijl statements die direct worden uitgevoerd elke keer worden gecompileerd. Voorbereide uitvoering kan ook zorgen voor een vermindering van netwerkverkeer omdat de driver een uitvoeringsplan-identificatie en de parameterwaarden, in plaats van een volledige SQL-instructie, telkens weer naar de databron kan sturen telkens wanneer de instructie wordt uitgevoerd.
SQL Server vermindert het prestatieverschil tussen directe en voorbereide uitvoering door verbeterde algoritmen voor het detecteren en hergebruiken van uitvoeringsplannen van SQLExecDirect. Hierdoor zijn sommige prestatievoordelen van voorbereide uitvoering beschikbaar voor direct uitgevoerde statements. Voor meer informatie, zie Direct Execution.
SQL Server biedt ook native ondersteuning voor voorbereide uitvoering. Een uitvoeringsplan wordt gebouwd op SQLPrepare en later uitgevoerd wanneer SQLExecute wordt aangeroepen. Omdat SQL Server niet verplicht is om tijdelijke opgeslagen procedures op SQLPrepare te bouwen, is er geen extra overhead op de systeemtabellen in tempdb.
Om prestatieredenen wordt de voorbereiding van de instructie uitgesteld totdat SQLExecute wordt aangeroepen of een metaproperty-operatie (zoals SQLDescribeCol of SQLDescribeParam in ODBC) wordt uitgevoerd. Dit is het standaardgedrag. Eventuele fouten in de te bereiden instructie zijn pas bekend als de instructie wordt uitgevoerd of een metaproperty-operatie wordt uitgevoerd. Door het SQL Server Native Client ODBC driver-specifieke statement-attribuut SQL_SOPT_SS_DEFER_PREPARE op SQL_DP_OFF te zetten, kan dit standaardgedrag worden uitgeschakeld.
In het geval van uitgestelde voorbereiding genereert het aanroepen van SQLDescribeCol of SQLDescribeParam voordat SQLExecute wordt aanroepen een extra roundtrip naar de server. Op SQLDescribeCol verwijdert de driver de WHERE-clausule uit de query en stuurt deze naar de server met SET FMTONLY ON om de beschrijving van de kolommen in de eerste resultaatset die door de query wordt teruggegeven, op te halen. Op SQLDescribePam roept de driver de server aan om een beschrijving te krijgen van de expressies of kolommen waarnaar wordt verwezen door eventuele parametermarkers in de query. Deze methode kent ook enkele beperkingen, zoals het niet kunnen oplossen van parameters in subqueries.
Overmatig gebruik van SQLPrepare met de SQL Server Native Client ODBC-driver verslechtert de prestaties, vooral wanneer deze is verbonden met eerdere versies van SQL Server. Voorbereide uitvoering mag niet worden gebruikt voor instructies die één keer worden uitgevoerd. Voorbereide uitvoering is trager dan directe uitvoering voor één enkele uitvoering van een instructie, omdat het een extra netwerk-roundtrip van de client naar de server vereist. In eerdere versies van SQL Server genereert het ook een tijdelijke opgeslagen procedure.
Prepared statements kunnen niet worden gebruikt om tijdelijke objecten op SQL Server te maken.
Sommige vroege ODBC-applicaties gebruikten SQLPrepare telkens wanneer SQLBindParameter werd gebruikt. SQLBindParameter vereist geen gebruik van SQLPrepare, het kan worden gebruikt met SQLExecDirect. Gebruik bijvoorbeeld SQLExecDirect met SQLBindParameter om de returncode of outputparameters op te halen van een opgeslagen procedure die slechts één keer wordt uitgevoerd. Gebruik SQLPrepare niet met SQLBindParameter tenzij dezelfde instructie meerdere keren wordt uitgevoerd.