Freigeben über


Vorbereitete Ausführung

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

Die ODBC-API definiert die vorbereitete Ausführung als Möglichkeit, um den Analyse- und Kompilierungsaufwand zu reduzieren, der mit der wiederholten Ausführung einer Transact-SQL-Anweisung verknüpft ist. Die Anwendung erstellt eine Zeichenfolge mit einer SQL-Anweisung und führt sie dann in zwei Phasen aus. Sie ruft die SQLPrepare-Funktion einmal auf, damit die Anweisung von der Datenbank-Engine in einen Ausführungsplan analysiert und kompiliert wird. 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 Erneutes Verwenden von Ausführungsplänen aus 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 Direct Execution.

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 zum Erstellen temporärer gespeicherter Prozeduren für SQLPrepare nicht erforderlich ist, gibt es keinen zusätzlichen Aufwand für die Systemtabellen in tempdb.

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

Bei verzögerter Vorbereitung generiert das Aufrufen von SQLDescribeCol oder SQLDescribeParam vor dem Aufrufen von SQLExecute einen zusätzlichen Roundtrip zum Server. Bei SQLDescribeCol entfernt der Treiber die WHERE-Klausel aus der Abfrage und sendet sie an den Server mit SET FMTONLY ON, um die Beschreibung der Spalten im ersten Von der Abfrage zurückgegebenen Resultset abzurufen. In SQLDescribeParam ruft der Treiber den Server auf, um eine Beschreibung der Ausdrücke oder Spalten abzurufen, auf die von parametermarkierungen 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.

Ü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 generiert sie auch eine temporäre gespeicherte Prozedur.

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

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

Weitere Informationen

Ausführen von ODBC-Anweisungen