Partager via


Préparation des commandes

Le fournisseur OLE DB SQL Server Native Client prend en charge la préparation de commande pour l'exécution multiple optimisée d'une commande unique ; toutefois, la préparation de commande génère une charge mémoire et un consommateur n'a pas besoin de préparer une commande pour l'exécuter plus d'une fois. En général, la préparation de commande est nécessaire si celle-ci doit être exécutée plus de trois fois.

Pour des raisons de performance, la préparation de commande est différée jusqu'à ce que la commande soit exécutée. Il s'agit du comportement par défaut. Toute erreur dans la commande en cours de préparation est inconnue tant que la commande n'a pas été exécutée ou qu'une opération de métapropriété n'a pas été effectuée. L'affectation de la valeur FALSE à la propriété SQL Server SSPROP_DEFERPREPARE peut désactiver ce comportement par défaut.

Dans SQL Server, lorsqu'une commande est exécutée directement (sans la préparer au préalable), un plan d'exécution est créé et mis en cache. Si l'instruction SQL est réexécutée, SQL Server dispose d'un algorithme efficace pour faire correspondre la nouvelle instruction au 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 la prise en charge native de la préparation et de l'exécution des 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 de 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 pour 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 plusieurs fois.

Dans SQL Server 2005, SQL Server 2000 et SQL Server 7.0, les instructions préparées ne peuvent pas être utilisées pour créer des objets temporaires et ne peuvent pas faire référence à 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 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 et retourne des résultats comme si l'instruction elle-même avait été exécutée.

La création de procédure stockée temporaire est contrôlée par la propriété d'initialisation spécifique au fournisseur OLE DB SQL Server Native Client 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 essaie 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 d'application a des 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 significatives de tempdb, base de données système SQL Server dans laquelle les 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'un des événements suivants se produit :

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

  • Le consommateur utilise ICommandPrepare::Unprepare pour indiquer qu'il ne requiert plus le 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 possède 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

Concepts