Vorbereitete Ausführung

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Die ODBC-API definiert die vorbereitete Ausführung als Möglichkeit, den Analyse- und Kompilierungsaufwand zu reduzieren, der mit der wiederholten Ausführung einer Transact-SQL-Anweisung verbunden ist. Die Anwendung erstellt eine Zeichenfolge, die eine SQL-Anweisung enthält, und führt diese Anweisung dann in zwei Phasen aus. Die SQLPrepare-Funktion wird einmal aufgerufen, um die Anweisung analysieren und von der Datenbank-Engine in einen Ausführungsplan kompilieren zu lassen. Anschließend wird SQLExecute für jede Ausführung des vorbereiteten Ausführungsplans aufgerufen. Dadurch wird bei jeder Ausführung der mit der Analyse und Kompilierung verbundene Aufwand reduziert. Die vorbereitete Ausführung wird in Anwendungen häufig verwendet, um dieselbe parametrisierte SQL-Anweisung mehrfach auszuführen.

Bei den meisten Datenbanken ist die vorbereitete Ausführung schneller als eine direkte Ausführung von Anweisungen, die mehr als drei- oder viermal ausgeführt werden, hauptsächlich da die Anweisung nur einmal kompiliert wird, während die direkt ausgeführten Anweisungen bei jeder Ausführung kompiliert werden. Die vorbereitete Ausführung kann auch zu einer Reduzierung des Netzwerkverkehrs beitragen, da der Treiber bei jeder Ausführung der Anweisung eine Ausführungsplan-ID und die Parameterwerte an die Datenquelle senden kann, anstatt die gesamte SQL-Anweisung zu senden.

SQL Server reduziert den Leistungsunterschied zwischen direkter und vorbereiteter Ausführung durch verbesserte Algorithmen zum Erkennen und Wiederverwendung von Ausführungsplänen von SQLExecDirect. Dadurch stehen einige der Leistungsvorteile einer vorbereiteten Ausführung auch für direkt ausgeführte Anweisungen zur Verfügung. Weitere Informationen finden Sie unter Direkte Ausführung.

SQL Server bietet auch native Unterstützung für die vorbereitete Ausführung. Ein Ausführungsplan basiert auf SQLPrepare und wird später ausgeführt, wenn SQLExecute aufgerufen wird. Da SQL Server nicht erforderlich ist, um temporäre gespeicherte Prozeduren in SQLPrepare zu erstellen, entsteht kein zusätzlicher Mehraufwand für die Systemtabellen in tempdb.

Aus Leistungsgründen wird die Anweisungsvorbereitung verzögert, bis SQLExecute aufgerufen oder ein Metaeigenschaftenvorgang (z. B. SQLDescribeCol oder SQLDescribeParam in ODBC) ausgeführt wird. Dies ist das Standardverhalten. Fehler in der vorbereiteten Anweisung werden erst dann erkannt, wenn die Anweisung ausgeführt oder ein Metaeigenschaftsvorgang durchgeführt wird. Das Festlegen des SQL Server Native Client ODBC-treiberspezifischen Anweisungsattributs SQL_SOPT_SS_DEFER_PREPARE auf SQL_DP_OFF kann dieses Standardverhalten deaktivieren.

Im Falle einer verzögerten Vorbereitung generiert der Aufruf von SQLDescribeCol oder SQLDescribeParam vor dem Aufrufen von SQLExecute einen zusätzlichen Roundtrip zum Server. In SQLDescribeCol entfernt der Treiber die WHERE-Klausel aus der Abfrage und sendet sie mit SET FMTONLY ON an den Server, um die Beschreibung der Spalten im ersten Resultset abzurufen, die von der Abfrage zurückgegeben werden. In SQLDescribeParam ruft der Treiber den Server auf, um eine Beschreibung der Ausdrücke oder Spalten abzurufen, auf die von Parametermarkern in der Abfrage verwiesen wird. Bei dieser Methode kommt es auch zu einigen Einschränkungen, z. B. können keine Parameter in Unterabfragen gelöst werden.

Die übermäßige Verwendung von SQLPrepare mit dem SQL Server Native Client ODBC-Treiber beeinträchtigt die Leistung, insbesondere wenn sie mit früheren Versionen von SQL Server verbunden ist. Die vorbereitete Ausführung sollte nicht für Anwendungen verwendet werden, die nur einmal ausgeführt werden. Die vorbereitete Ausführung dauert länger als eine direkte Ausführung für eine einzelne Ausführung einer Anweisung, da ein zusätzlicher Netzwerkroundtrip vom Client zum Server erforderlich ist. In früheren Versionen von SQL Server wird auch eine temporäre gespeicherte Prozedur generiert.

Vorbereitete Anweisungen können nicht zum Erstellen von temporären Objekten in SQL Server verwendet werden.

Einige frühe ODBC-Anwendungen verwendeten SQLPrepare bei jeder Verwendung von SQLBindParameter . SQLBindParameter erfordert nicht die Verwendung von SQLPrepare, es kann mit SQLExecDirect verwendet werden. Verwenden Sie beispielsweise SQLExecDirect mit SQLBindParameter , um den Rückgabecode oder die Ausgabeparameter aus einer gespeicherten Prozedur abzurufen, die nur einmal ausgeführt wird. Verwenden Sie SQLPrepare nicht mit SQLBindParameter , es sei denn, die gleiche Anweisung wird mehrmals ausgeführt.

Weitere Informationen

Ausführen von Anweisungen (ODBC)