294
Chapitre 9. Optimisation des procédures stockées
valeur du paramètre passé. Le plan sera donc calculé selon le paramètre envoyé lors
du premier appel de la procédure. Si c’est 'Ackerman', la procédure fera toujours un
seek, si c’est 'A%', elle scannera toujours la table. Le parameter sniffing est une bonne
chose lorsque le premier appel est passé avec des paramètres représentatifs des futurs
appels de la procédure. Par contre, c’est une mauvaise chose lorsque le premier appel
est un cas particulier. Nous allons en faire la démonstration, ce qui nous permettra
de démontrer une autre particularité du parameter sniffing :
-- procédure avec utilisation directe du paramètre
CREATE PROCEDURE dbo.GetContactsParameter
@LastName nvarchar(50) = NULL
AS BEGIN
SET NOCOUNT ON
SELECT FirstName, LastName FROM Person.Contact
WHERE LastName LIKE @LastName;
END
GO
-- procédure avec variable locale
CREATE PROCEDURE dbo.GetContactsLocalVariable
@LastName nvarchar(50) = NULL
AS BEGIN
SET NOCOUNT ON
DECLARE @MyLastName nvarchar(50)
SET @MyLastName = @LastName
SELECT FirstName, LastName FROM Person.Contact
WHERE LastName LIKE @MyLastName;
END
GO
-- utilisation
EXEC dbo.GetContactsParameter @LastName = 'Abercrombie'
GO
EXEC dbo.GetContactsLocalVariable @LastName = 'Abercrombie'
GO
EXEC dbo.GetContactsParameter @LastName = '%'
GO
EXEC dbo.GetContactsLocalVariable @LastName = '%'
GO
Avant d’expliquer la raison pour laquelle nous avons créé deux procédures, observons les résultats de l’exécution, présentés figure 9.1. Nous y voyons les statistiques
d’exécution des quatre appels de procédure, ainsi que le plan d’exécution généré du
premier appel.
Précédent

- 306/334

Suivant