Partager via


Réutilisation des paramètres et des plans d'exécution

L'utilisation de paramètres, notamment de marqueurs de paramètres dans les applications ADO, OLE DB et ODBC, peut favoriser la réutilisation des plans d'exécution.

ms175580.security(fr-fr,SQL.90).gifRemarque relative à la sécurité :
L'utilisation de paramètres ou de marqueurs de paramètres pour la conservation des valeurs entrées par les utilisateurs finaux est plus fiable que la concaténation des valeurs dans une chaîne qui sera exécutée à l'aide de la méthode API d'accès aux données, à savoir l'instruction EXECUTE, ou de la procédure stockée sp_executesql.

La seule différence entre les deux instructions SELECT suivantes porte sur les valeurs comparées dans la clause WHERE :

SELECT * FROM AdventureWorks.Production.Product WHERE ProductSubcategoryID = 1

SELECT * FROM AdventureWorks.Production.Product WHERE ProductSubcategoryID= 4

La seule différence entre les plans d'exécution de ces requêtes est la valeur stockée pour la comparaison avec la colonne ProductSubcategoryID. Bien que SQL Server 2005 soit conçu pour toujours reconnaître que les instructions génèrent essentiellement le même plan et réutilisent les plans, il peut arriver que SQL Server ne le détecte pas dans les instructions SQL complexes.

La séparation des constantes de l'instruction SQL à l'aide de paramètres permet au moteur relationnel de reconnaître plus facilement les plans en double. Vous pouvez utiliser les paramètres des manières suivantes :

  • Dans Transact-SQL, utilisez sp_executesql :

    DECLARE @MyIntParm INT
    SET @MyIntParm = 1
    EXEC sp_executesql
      N'SELECT * FROM AdventureWorks.Production.Product WHERE ProductSubcategoryID = @Parm',
      N'@Parm INT',
      @MyIntParm
    

    Cette méthode est recommandée pour les scripts Transact-SQL, les procédures stockées ou les déclencheurs SQL qui génèrent dynamiquement des instructions SQL.

  • ADO, OLE DB et ODBC utilisent des marqueurs de paramètres. Les marqueurs de paramètres sont des points d'interrogation (?) qui remplacent une constante dans une instruction SQL et qui sont liés à une variable de programme. Dans une application ODBC, vous pourriez par exemple procéder comme suit :

    • Utilisez SQLBindParameter pour lier une variable de type entier au premier marqueur de paramètres dans une instruction SQL.

    • Placez la valeur de type entier dans la variable.

    • Exécutez l'instruction en spécifiant le marqueur de paramètres (?) :

      SQLExecDirect(hstmt, 
        "SELECT * FROM AdventureWorks.Production.Product WHERE ProductSubcategoryID = ?",
        SQL_NTS);
      

      Le fournisseur OLE DB pour SQL Native Client et le pilote ODBC de SQL Native Client fournis avec SQL Server 2005 utilisent sp_executesql pour envoyer des instructions à SQL Server 2005 lorsque les marqueurs de paramètres sont utilisés dans les applications.

  • Pour concevoir des procédures stockées qui utilisent les paramètres par définition.

Si vous ne construisez pas explicitement des paramètres dans la conception de vos applications, vous pouvez toujours vous fier à l'optimiseur de requête SQL Server qui paramètre automatiquement certaines requêtes à l'aide du comportement par défaut de Paramétrage simple. Vous pouvez également forcer l'optimiseur de requête à paramétrer l'ensemble des requêtes de la base de données en attribuant la valeur FORCED à l'option PARAMETERIZATION de l'instruction ALTER DATABASE. Pour plus d'informations, consultez Paramétrage forcé.

En cas d'activation du paramétrage forcé, il est toujours possible d'utiliser le paramétrage simple. Par exemple, la requête suivante ne peut être paramétrée conformément aux règles de paramétrage forcé dans SQL Server 2005 :

SELECT * FROM Person.Address
WHERE AddressID = 1 + 2

Elle peut toutefois être paramétrée conformément aux règles de paramétrage simple. En cas de tentative infructueuse de paramétrage forcé, le paramétrage simple est activé.

Voir aussi

Référence

Objet SQLServer:SQL Statistics

Autres ressources

sp_executesql (Transact-SQL)
Command Parameters
Using Statement Parameters

Aide et Informations

Assistance sur SQL Server 2005