Partager via


Préparation des commandes

Le fournisseur OLE DB SQL Server Native Client prend en charge la préparation des commandes pour une exécution multiple optimisée d’une seule commande ; Toutefois, la préparation des commandes génère une surcharge et un consommateur n’a pas besoin de préparer une commande pour l’exécuter plusieurs fois. En général, une commande doit être préparée si elle sera exécutée plus de trois fois.

Pour des raisons de performances, la préparation de la commande est différée jusqu’à ce que la commande soit exécutée. Il s’agit du comportement par défaut. Toutes les erreurs dans la commande en cours de préparation ne sont pas connues tant que la commande n’est pas exécutée ou qu’une opération de métapropriété n’est pas effectuée. La définition de la propriété SQL Server SSPROP_DEFERPREPARE sur FALSE peut désactiver ce comportement par défaut.

Dans SQL Server, lorsqu’une commande est exécutée directement (sans la préparer en premier), un plan d’exécution est créé et mis en cache. Si l’instruction SQL est réexécutée, SQL Server a un algorithme efficace pour correspondre à la nouvelle instruction avec le plan d’exécution existant dans le cache et réutilise le plan d’exécution pour cette instruction.

Pour les commandes préparées, SQL Server fournit une prise en charge native de la préparation et de l’exécution d’instructions de commande. Lorsque vous préparez une instruction, SQL Server crée un plan d’exécution, le met en cache et retourne un handle à ce plan d’exécution au fournisseur. Le fournisseur utilise ensuite ce handle pour exécuter l’instruction à plusieurs reprises. Aucune procédure stockée n’est créée. Étant donné que le handle identifie directement le plan d’exécution d’une instruction SQL au lieu de faire correspondre l’instruction au plan d’exécution dans le cache (comme c’est le cas pour l’exécution directe), il est plus efficace de préparer une instruction que de l’exécuter directement, si vous savez que l’instruction sera exécutée plus de plusieurs fois.

Dans SQL Server 2005, les instructions préparées ne peuvent pas être utilisées pour créer des objets temporaires et ne peuvent pas référencer des procédures stockées système qui créent des objets temporaires, tels que des tables temporaires. Ces procédures doivent être exécutées directement.

Certaines commandes ne doivent jamais être préparées. Par exemple, les commandes qui spécifient l’exécution de procédure stockée ou qui incluent du texte non valide pour la création de procédure stockée SQL Server ne doivent pas être préparées.

Si une procédure stockée temporaire est créée, le fournisseur OLE DB SQL Server Native Client exécute la procédure stockée temporaire, retournant les résultats comme si l’instruction elle-même a été exécutée.

La création de procédure stockée temporaire est contrôlée par le fournisseur OLE DB SQL Server Native Client -specific propriété d’initialisation SSPROP_INIT_USEPROCFORPREP. Si la valeur de propriété est SSPROPVAL_USEPROCFORPREP_ON ou SSPROPVAL_USEPROCFORPREP_ON_DROP, le fournisseur OLE DB SQL Server Native Client tente de créer une procédure stockée lorsqu’une commande est préparée. La création de procédure stockée réussit si l’utilisateur de l’application dispose d’autorisations SQL Server suffisantes.

Pour les consommateurs qui se déconnectent rarement, la création de procédures stockées temporaires peut nécessiter des ressources importantes de tempdb, la base de données système SQL Server dans laquelle des objets temporaires sont créés. Lorsque la valeur de SSPROP_INIT_USEPROCFORPREP est SSPROPVAL_USEPROCFORPREP_ ON, les procédures stockées temporaires créées par le fournisseur OLE DB SQL Server Native Client sont supprimées uniquement lorsque la session qui a créé la commande perd sa connexion à l’instance de SQL Server. Si cette connexion est la connexion par défaut créée lors de l’initialisation de la source de données, la procédure stockée temporaire est supprimée uniquement lorsque la source de données devient non initialisée.

Lorsque la valeur de SSPROP_INIT_USEPROCFORPREP est SSPROPVAL_USEPROCFORPREP_ON_DROP, les procédures stockées temporaires du fournisseur OLE DB SQL Server Native Client sont supprimées lorsque l’une des opérations suivantes se produit :

  • Le consommateur utilise ICommandText ::SetCommandText pour indiquer une nouvelle commande.

  • Le consommateur utilise ICommandPrepare ::Unprepare pour indiquer qu’il n’a plus besoin du texte de la commande.

  • Le consommateur libère toutes les références à l’objet de commande à l’aide de la procédure stockée temporaire.

Un objet de commande a au plus une procédure stockée temporaire dans tempdb. Toute procédure stockée temporaire existante représente le texte de commande actuel d’un objet de commande spécifique.

Voir aussi

Commandes