Freigeben über


Dynamische SQL-Leistung in ODBC

Obwohl statische SQL in vielen Situationen gut funktioniert, gibt es eine Klasse von Anwendungen, in denen der Datenzugriff nicht im Voraus bestimmt werden kann. Angenommen, ein Arbeitsblatt ermöglicht es einem Benutzer, eine Abfrage einzugeben, die das Arbeitsblatt dann an den DBMS sendet, um Daten abzurufen. Der Inhalt dieser Abfrage kann dem Programmierer offensichtlich nicht bekannt sein, wenn das Tabellenkalkulationsprogramm geschrieben wird.

Dynamische Ausführung

Um dieses Problem zu lösen, verwendet die Kalkulationstabelle eine Form von eingebettetem SQL, die als dynamisches SQL bezeichnet wird. Im Gegensatz zu statischen SQL-Anweisungen, die im Programm hartcodiert sind, können dynamische SQL-Anweisungen zur Laufzeit erstellt und in einer Zeichenfolgenhostvariable platziert werden. Sie werden dann zur Verarbeitung an das DBMS gesendet. Da dbMS zur Laufzeit einen Zugriffsplan für dynamische SQL-Anweisungen generieren muss, ist dynamic SQL im Allgemeinen langsamer als statische SQL. Wenn ein Programm, das dynamische SQL-Anweisungen enthält, kompiliert wird, werden die dynamischen SQL-Anweisungen nicht aus dem Programm entfernt, wie in statischem SQL. Stattdessen werden sie durch einen Funktionsaufruf ersetzt, der die Anweisung an das DBMS übergibt; Statische SQL-Anweisungen im selben Programm werden normal behandelt.

Die einfachste Methode zum Ausführen einer dynamischen SQL-Anweisung ist eine EXECUTE IMMEDIATE-Anweisung. Diese Anweisung übergibt die SQL-Anweisung zur Kompilierung und Ausführung an das DBMS.

Ein Nachteil der EXECUTE IMMEDIATE-Anweisung besteht darin, dass die DBMS jedes der fünf Schritte zur Verarbeitung einer SQL-Anweisung bei jeder Ausführung der Anweisung durchlaufen muss. Der Aufwand, der an diesem Prozess beteiligt ist, kann erheblich sein, wenn viele Anweisungen dynamisch ausgeführt werden, und es ist verschwendet, wenn diese Anweisungen ähnlich sind.

Vorbereitete Ausführung

Um die oben genannte Situation zu beheben, bietet dynamische SQL eine optimierte Form der Ausführung, die als vorbereitete Ausführung bezeichnet wird, die die folgenden Schritte verwendet:

  1. Das Programm erstellt eine SQL-Anweisung in einem Puffer, genau wie für die EXECUTE IMMEDIATE-Anweisung. Anstelle von Hostvariablen kann ein Fragezeichen (?) an einer beliebigen Stelle im Anweisungstext durch eine Konstante ersetzt werden, um anzugeben, dass später ein Wert für die Konstante angegeben wird. Das Fragezeichen wird als Parametermarkierung aufgerufen.

  2. Das Programm übergibt die SQL-Anweisung an das DBMS mit einer PREPARE-Anweisung, die anfordert, dass die DBMS analysiert, überprüft und optimiert wird und einen Ausführungsplan dafür generiert. Das Programm verwendet dann eine EXECUTE-Anweisung (keine EXECUTE IMMEDIATE-Anweisung), um die PREPARE-Anweisung zu einem späteren Zeitpunkt auszuführen. Sie übergibt Parameterwerte für die Anweisung über eine spezielle Datenstruktur namens SQL Data Area oder SQLDA.

  3. Das Programm kann die EXECUTE-Anweisung wiederholt verwenden, wobei bei jeder Ausführung der dynamischen Anweisung unterschiedliche Parameterwerte angegeben werden.

Die vorbereitete Ausführung ist immer noch nicht mit statischem SQL identisch. In statischem SQL werden die ersten vier Schritte der Verarbeitung einer SQL-Anweisung zur Kompilierungszeit ausgeführt. Bei der vorbereiteten Ausführung werden diese Schritte zur Laufzeit noch ausgeführt, aber sie werden nur einmal ausgeführt. Die Ausführung des Plans findet nur statt, wenn EXECUTE aufgerufen wird. Dieses Verhalten trägt dazu bei, einige der Leistungsnachteile in der Architektur dynamischer SQL zu beseitigen.

Siehe auch

EXECUTE (Transact-SQL)
sp_executesql (Transact-SQL)