Préparation des instructions SQL

Le moteur relationnel de SQL Server permet la prise en charge intégrale de la préparation des instructions SQL avant leur exécution. Si une application doit exécuter une instruction SQL plusieurs fois, elle peut recourir à l'API de base de données pour effectuer les opérations suivantes :

  • Préparer l'instruction en une seule fois. L'instruction SQL est compilée dans un plan d'exécution.

  • Exécuter le plan d'exécution précompilé chaque fois qu'elle doit exécuter l'instruction. Cela évite de recompiler l'instruction SQL après chaque exécution suivant la première.

    La préparation et l'exécution des instructions sont contrôlées par les fonctions et les méthodes API. Ces dernières ne font pas partie du langage Transact-SQL. Le modèle de préparation et d'exécution des instructions SQL est pris en charge par le fournisseur OLE DB Native Client SQL Server et par le pilote ODBC Native Client SQL Server. Lors d'une demande de préparation, le fournisseur ou le pilote envoie l'instruction à SQL Server avec une demande de préparation de l'instruction. SQL Server compile un plan d'exécution et retourne un descripteur de ce plan au fournisseur ou au pilote. Pour toute requête d'exécution, le fournisseur ou le pilote envoie au serveur une requête d'exécution du plan associé au descripteur.

Les instructions préparées ne peuvent pas être utilisées pour la création d'objets temporaires dans SQL Server. Elles ne peuvent pas faire référence à des procédures stockées du système qui créent des objets temporaires, tels que des tables temporaires. Ces procédures doivent être exécutées directement.

L'utilisation excessive du modèle de préparation et d'exécution peut nuire aux performances. Si une instruction n'est exécutée qu'une seule fois, son exécution directe ne requiert qu'un seul aller-retour au serveur. La préparation suivie de l'exécution unique d'une instruction SQL nécessite un aller-retour supplémentaire : un pour préparer l'instruction et un pour l'exécuter.

La préparation d'une instruction est plus efficace si vous utilisez les marqueurs de paramètres. Par exemple, supposons que vous demandez occasionnellement à une application d'extraire des informations sur un produit à partir de l'exemple de base de données AdventureWorks. Il existe deux moyens pour y arriver :

Premièrement, l'application peut exécuter une requête différente pour chaque produit demandé :

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

Deuxièmement, l'application peut procéder comme suit :

  1. Préparer une instruction contenant un marqueur de paramètres (?) :

    SELECT * FROM AdventureWorks.Production.Product
    WHERE ProductID = ?;
    
  2. Lier une variable de programme au marqueur de paramètres.

  3. Chaque fois que vous avez besoin d'informations sur un produit, l'application remplit la variable liée avec la valeur de la clé et exécute l'instruction.

La seconde méthode est plus efficace lorsque l'instruction est exécutée plus de trois fois.

Dans SQL Server, le modèle de préparation et d'exécution présente très peu d'avantages en terme de performances par rapport à l'exécution directe en raison du mode de réutilisation des plans d'exécution par SQL Server. SQL Server intègre des algorithmes efficaces associant les instructions SQL en cours aux plans d'exécution générés pour des exécutions antérieures de la même instruction SQL. Si une application exécute plusieurs fois une instruction SQL avec des marqueurs de paramètres, SQL Server réutilisera le plan d'exécution de la première exécution pour les exécutions suivantes (sauf si le plan a été supprimé du cache de procédures suite à son expiration). Le modèle de préparation et d'exécution offre encore d'autres avantages :

  • La recherche d'un plan d'exécution à l'aide d'un descripteur d'identification est plus efficace que les algorithmes utilisés pour associer une instruction SQL à un plan d'exécution existant.

  • L'application peut contrôler le moment où le plan d'exécution est créé et réutilisé.

  • Le modèle de préparation et d'exécution peut être transféré à d'autres bases de données, y compris des versions antérieures de SQL Server.