Vorbereiten von SQL-Anweisungen

Das relationale Modul von SQL Server bietet vollständige Unterstützung für die Vorbereitung von SQL-Anweisungen vor ihrer Ausführung. Wenn eine Anwendung eine SQL-Anweisung mehrfach ausführen muss, kann mithilfe der Datenbank-API Folgendes erreicht werden:

  • Einmaliges Vorbereiten der Anweisung. Mit diesem Schritt wird die SQL-Anweisung zu einem Ausführungsplan kompiliert.

  • Ausführen des vorkompilierten Ausführungsplans immer dann, wenn die Anweisung ausgeführt werden muss. Auf diese Weise muss die SQL-Anweisung nach der ersten Ausführung nicht jedes Mal erneut kompiliert werden.

    Das Vorbereiten und Ausführen von Anweisungen wird durch API-Funktionen und -Methoden gesteuert. Es ist kein Teil der Transact-SQL-Sprache. Das Vorbereiten/Ausführen-Modell für die Ausführung von SQL-Anweisungen wird von dem SQL Server Native Client-OLE DB-Anbieter und dem SQL Server Native Client-ODBC-Treiber unterstützt. Bei einer Vorbereitungsanforderung sendet der Anbieter oder der Treiber die Anweisung zusammen mit der Anforderung zur Vorbereitung der Anweisung an SQL Server. Von SQL Server wird ein Ausführungsplan kompiliert und ein Handle für diesen Plan an den Anbieter oder Treiber zurückgegeben. Bei einer Ausführungsanforderung sendet der Anbieter bzw. Treiber eine Anforderung an den Server, den dem Handle zugeordneten Plan auszuführen.

Vorbereitete Anweisungen können nicht zum Erstellen von temporären Objekten in SQL Server verwendet werden. Vorbereitete Anweisungen können nicht auf gespeicherte Systemprozeduren verweisen, die temporäre Objekte, wie z. B. temporäre Tabellen, erstellen. Diese Prozeduren müssen direkt ausgeführt werden.

Durch übermäßige Verwendung des Vorbereiten/Ausführen-Modells kann die Leistung beeinträchtigt werden. Wenn eine Anweisung nur ein Mal ausgeführt wird, wird durch eine direkte Ausführung nur ein Netzwerkroundtrip zum Server benötigt. Das Vorbereiten und Ausführen einer SQL-Anweisung, die nur ein Mal ausgeführt wird, erfordert einen zusätzlichen Netzwerkroundtrip: einen Trip zur Vorbereitung und einen Trip zur Ausführung der Anweisung.

Das Vorbereiten einer Anweisung ist effizienter, wenn Parametermarkierungen verwendet werden. Nehmen Sie z. B. an, eine Anwendung soll gelegentlich Produktinformationen aus der AdventureWorks2008R2-Beispieldatenbank abrufen. Es gibt zwei Möglichkeiten, wie die Anwendung diese Aufgabe ausführen kann.

Die erste Möglichkeit besteht darin, dass die Anwendung für jedes angeforderte Produkt eine eigene Abfrage ausführt:

SELECT * FROM AdventureWorks2008R2.Production.Product
WHERE ProductID = 63;

Die zweite Möglichkeit umfasst folgende Schritte:

  1. Die Anwendung bereitet eine Anweisung vor, die die Parametermarkierung (?) enthält:

    SELECT * FROM AdventureWorks2008R2.Production.Product
    WHERE ProductID = ?;
    
  2. Die Anwendung bindet eine Programmvariable an die Parametermarkierung.

  3. Die Anwendung füllt die gebundene Variable mit dem Schlüsselwert und führt die Anweisung aus, sobald die Produktinformationen benötigt werden.

Die zweite Methode ist effizienter, sobald die Anweisung mehr als drei Mal ausgeführt wird.

In SQL Server bietet das Vorbereiten/Ausführen-Modell aufgrund der Art und Weise, wie SQL Server Ausführungspläne wiederverwendet, keine erheblichen Leistungsvorteile gegenüber der direkten Ausführung. SQL Server besitzt effiziente Algorithmen zur Ermittlung von Übereinstimmungen zwischen aktuellen SQL-Anweisungen und Ausführungsplänen, die für vorhergehende Ausführungen derselben SQL-Anweisung generiert wurden. Wenn eine Anwendung eine SQL-Anweisung mit Parametermarkierungen mehrfach ausführt, verwendet SQL Server den Ausführungsplan der ersten Ausführung für die zweite und alle folgenden Ausführungen erneut (es sei denn, der Plan wird aus dem Prozedurcache entfernt). Das Vorbereiten/Ausführen-Modell bietet jedoch weiterhin die folgenden Vorteile:

  • Das Suchen eines Ausführungsplans anhand eines identifizierenden Handles ist effizienter als die Algorithmen, die für das Ermitteln einer übereinstimmenden SQL-Anweisung mit vorhandenen Ausführungsplänen verwendet werden.

  • Die Anwendung kann steuern, wann der Ausführungsplan erstellt, und wann er wiederverwendet werden soll.

  • Das Vorbereiten/Ausführen-Modell kann auf andere Datenbanken portiert werden, einschließlich früherer Versionen von SQL Server.