Delen via


Opdrachten voorbereiden

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform Systeem (PDW)SQL-database in Microsoft Fabric

OLE DB-stuurprogramma downloaden

De OLE DB Driver voor SQL Server ondersteunt commandovoorbereiding voor geoptimaliseerde meervoudige uitvoering van één enkel commando; echter, commandovoorbereiding genereert overhead, en een consument hoeft een commando niet meer dan één keer voor te bereiden om het uit te voeren. In het algemeen moet een commando worden voorbereid als het meer dan drie keer wordt uitgevoerd.

Om prestatieredenen wordt de voorbereiding van het commando uitgesteld totdat het commando is uitgevoerd. Dit is het standaardgedrag. Eventuele fouten in het commando dat wordt voorbereid, zijn pas bekend als het commando wordt uitgevoerd of een metaproperty-operatie wordt uitgevoerd. Door de SQL Server-eigenschap SSPROP_DEFERPREPARE op FALSE te zetten, kan dit standaardgedrag worden uitgeschakeld.

In SQL Server wordt een uitvoeringsplan gemaakt en gecachet wanneer een commando direct wordt uitgevoerd (zonder het eerst voor te bereiden). Als de SQL-instructie opnieuw wordt uitgevoerd, heeft SQL Server een efficiënt algoritme om de nieuwe instructie te matchen met het bestaande uitvoeringsplan in de cache, en hergebruikt het uitvoeringsplan voor die instructie.

Voor voorbereide commando's biedt SQL Server native ondersteuning voor het voorbereiden en uitvoeren van commandoinstructies. Wanneer je een statement voorbereidt, maakt SQL Server een uitvoeringsplan aan, cachet het en geeft een handle terug aan dit uitvoeringsplan aan de provider. De provider gebruikt deze handle vervolgens om de instructie herhaaldelijk uit te voeren. Er worden geen opgeslagen procedures aangemaakt. Omdat de handle direct het uitvoeringsplan voor een SQL-instructie identificeert in plaats van de instructie te koppelen aan het uitvoeringsplan in de cache (zoals bij directe uitvoering), is het efficiënter om een instructie voor te bereiden dan deze direct uit te voeren, als je weet dat de instructie meer dan een paar keer zal worden uitgevoerd.

In SQL Server 2005 (9.x) kunnen de voorbereide statements niet worden gebruikt om tijdelijke objecten te maken en kunnen ze geen systeemprocedures verwijzen die tijdelijke objecten aanmaken, zoals tijdelijke tabellen. Deze procedures moeten rechtstreeks worden uitgevoerd.

Sommige commando's moeten nooit voorbereid worden. Bijvoorbeeld, commando's die de uitvoering van opgeslagen procedures specificeren of ongeldige tekst bevatten voor het aanmaken van opgeslagen procedures in SQL Server, mogen niet worden voorbereid.

Als een tijdelijke opgeslagen procedure wordt aangemaakt, voert de OLE DB-driver voor SQL Server de tijdelijke opgeslagen procedure uit, waarbij resultaten worden teruggegeven alsof de instructie zelf is uitgevoerd.

Het aanmaken van tijdelijke opgeslagen procedures wordt beheerd door de OLE DB Driver voor SQL Server -specific initialisatieeigenschap SSPROP_INIT_USEPROCFORPREP. Als de eigenschapswaarde SSPROPVAL_USEPROCFORPREP_ON of SSPROPVAL_USEPROCFORPREP_ON_DROP is, probeert de OLE DB-driver voor SQL Server een opgeslagen procedure te creëren wanneer een commando wordt voorbereid. Het creëren van stored procedures slaagt als de applicatiegebruiker voldoende SQL Server-rechten heeft.

Voor consumenten die zelden de verbinding verbreken, kan het creëren van tijdelijke opgeslagen procedures aanzienlijke middelen van tempdb vereisen, de SQL Server-systeemdatabase waarin tijdelijke objecten worden aangemaakt. Wanneer de waarde van SSPROP_INIT_USEPROCFORPREP SSPROPVAL_USEPROCFORPREP_ ON is, worden tijdelijke opgeslagen procedures die door de OLE DB-driver voor SQL Server zijn aangemaakt, pas verwijderd wanneer de sessie die het commando heeft gemaakt de verbinding met de instantie van SQL Server verliest. Als die verbinding de standaardverbinding is die wordt aangemaakt bij de initialisatie van de databron, wordt de tijdelijke opgeslagen procedure pas verbroken wanneer de databron wordt ontgeïnitialiseerd.

Wanneer de waarde van SSPROP_INIT_USEPROCFORPREP SSPROPVAL_USEPROCFORPREP_ON_DROP is, wordt de OLE DB-driver voor SQL Server tijdelijke opgeslagen procedures verwijderd wanneer een van de volgende situaties zich voordoet:

  • De consument gebruikt ICommandText::SetCommandText om een nieuw commando aan te geven.

  • De consument gebruikt ICommandPrepare::Unprepare om aan te geven dat het commando-tekst niet langer nodig is.

  • De consument geeft alle verwijzingen naar het commando-object vrij via de tijdelijke opgeslagen procedure.

Een commando-object heeft hooguit één tijdelijke opgeslagen procedure in tempdb. Elke bestaande tijdelijke opgeslagen procedure vertegenwoordigt de huidige commandotekst van een specifiek commandoobject.

Zie ook

Opdrachten