Partager via


Préparation de commandes dans SQL Server Native Client

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

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, 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 (9.x), les instructions préparées ne peuvent pas être utilisées pour créer des objets temporaires et elles ne peuvent pas référencer des procédures stockées système qui créent des objets temporaires, comme 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, 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 - propriété d’initialisation spécifique 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 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, la base de données système de SQL Server où 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’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