Freigeben über


Vorbereiten von Befehlen in SQL Server Native Client

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

Der OLE DB-Anbieter von SQL Server Native Client unterstützt die Befehlsvorbereitung für eine optimierte Mehrfachausführung eines einzelnen Befehls; Die Befehlsvorbereitung generiert jedoch Mehraufwand, und ein Consumer muss einen Befehl nicht mehr als einmal für die Ausführung vorbereiten. Im Allgemeinen sollte ein Befehl vorbereitet werden, wenn er mehr als drei Mal ausgeführt wird.

Aus Leistungsgründen wird die Befehlsvorbereitung verzögert, bis der Befehl ausgeführt wird. Dies ist das Standardverhalten. Fehler in dem vorbereiteten Befehl werden erst dann erkannt, wenn der Befehl ausgeführt wird oder ein Metaeigenschaftsvorgang durchgeführt wird. Durch die Festlegung der SQL Server-Eigenschaft SSPROP_DEFERPREPARE auf FALSE kann dieses Standardverhalten deaktiviert werden.

Wenn ein Befehl in SQL Server direkt ausgeführt wird (ohne dass er zuerst vorbereitet wurde), wird ein Ausführungsplan erstellt und zwischengespeichert. Wenn die SQL-Anweisung erneut ausgeführt wird, setzt SQL Server einen effizienten Algorithmus ein, um die neue Anweisung dem vorhandenen Ausführungsplan im Cache zuzuordnen, und verwendet den Ausführungsplan dann erneut.

Für vorbereitete Befehle stellt SQL Server systemeigene Unterstützung für das Vorbereiten und Ausführen von Befehlsanweisungen bereit. Wenn Sie eine Anweisung vorbereiten, erstellt SQL Server einen Ausführungsplan, speichert ihn zwischen und übergibt dem Anbieter einen Handle für diesen Ausführungsplan. Der Anbieter verwendet dieses Handle, um die Anweisung wiederholt auszuführen. Es werden keine gespeicherten Prozeduren erstellt. Da das Handle den Ausführungsplan für eine SQL-Anweisung direkt identifiziert, anstatt die Anweisung dem Ausführungsplan im Cache zuzuordnen (wie bei der direkten Ausführung), ist es effizienter, eine Anweisung vorzubereiten, als sie direkt auszuführen, wenn Sie wissen, dass die Anweisung mehrmals ausgeführt wird.

In SQL Server 2005 (9.x) können vorbereitete Anweisungen nicht zur Erstellung temporärer Objekte verwendet werden, und vorbereitete Anweisungen können nicht auf gespeicherte Systemprozeduren verweisen, die temporäre Objekte erstellen, z. B. temporäre Tabellen. Diese Prozeduren müssen direkt ausgeführt werden.

Einige Befehle sollten nie vorbereitet werden. Beispielsweise sollten Befehle, mit denen die Ausführung gespeicherter Prozeduren angegeben wird oder die ungültigen Text für die Erstellung gespeicherter Prozeduren in SQL Server enthalten, nicht vorbereitet werden.

Wenn eine temporäre gespeicherte Prozedur erstellt wird, führt der OLE DB-Anbieter des SQL Server Native Client die temporäre gespeicherte Prozedur aus und gibt Ergebnisse zurück, als ob die Anweisung selbst ausgeführt wurde.

Die Erstellung temporärer gespeicherter Prozeduren wird durch den OLE DB-Anbieter des SQL Server Native Client gesteuert– spezifische Initialisierungseigenschaft SSPROP_INIT_USEPROCFORPREP. Wenn der Eigenschaftswert entweder SSPROPVAL_USEPROCFORPREP_ON oder SSPROPVAL_USEPROCFORPREP_ON_DROP ist, versucht der OLE DB-Anbieter des SQL Server Native Client, eine gespeicherte Prozedur zu erstellen, wenn ein Befehl vorbereitet wird. Die Erstellung der gespeicherten Prozedur ist erfolgreich, wenn der Anwendungsbenutzer über ausreichende SQL Server-Berechtigungen verfügt.

Bei Consumern, die selten die Verbindung trennen, kann die Erstellung temporär gespeicherter Prozeduren eine bedeutende Menge von Ressourcen in tempdb erfordern, der SQL Server-Systemdatenbank, in der temporäre Objekte erstellt werden. Wenn der Wert von SSPROP_INIT_USEPROCFORPREP on SSPROPVAL_USEPROCFORPREP_ ist, werden temporäre gespeicherte Prozeduren, die vom SQL Server Native Client OLE DB-Anbieter erstellt wurden, nur gelöscht, wenn die Sitzung, die den Befehl erstellt hat, die Verbindung mit der Instanz von SQL Server verliert. Falls es sich bei dieser Verbindung um die Standardverbindung handelt, die bei der Initialisierung der Datenquelle erstellt wurde, dann wird die temporär gespeicherte Prozedur nur dann gelöscht, wenn die Initialisierung der Datenquelle aufgehoben wird.

Wenn der Wert von SSPROP_INIT_USEPROCFORPREP SSPROPVAL_USEPROCFORPREP_ON_DROP ist, werden die temporären gespeicherten Prozeduren des SQL Server Native Client OLE DB-Anbieters gelöscht, wenn einer der folgenden Ereignisse auftritt:

  • Der Consumer verwendet ICommandText::SetCommandText, um einen neuen Befehl anzugeben.

  • Der Consumer verwendet ICommandPrepare::Unprepare, um anzugeben, dass der Befehlstext nicht mehr benötigt wird.

  • Der Consumer gibt alle Verweise auf das Befehlsobjekt, das die temporäre gespeicherte Prozedur verwendet, frei.

Ein Befehlsobjekt verfügt höchstens über eine temporär gespeicherte Prozedur in tempdb. Jede vorhandene temporär gespeicherte Prozedur stellt den aktuellen Befehlstext eines bestimmten Befehlsobjekts dar.

Weitere Informationen

Befehle