Ces tests (base de données AdventureWorks2008R2) montrent ce qui se passe :
SET NOCOUNT ON;
SET STATISTICS IO ON;
PRINT 'Test #1';
SELECT p.BusinessEntityID, p.LastName
FROM Person.Person p
WHERE p.LastName LIKE '%be%';
PRINT 'Test #2';
DECLARE @Pattern NVARCHAR(50);
SET @Pattern=N'%be%';
SELECT p.BusinessEntityID, p.LastName
FROM Person.Person p
WHERE p.LastName LIKE @Pattern;
SET STATISTICS IO OFF;
SET NOCOUNT OFF;
Résultats :
Test #1
Table 'Person'. Scan count 1, logical reads 106
Test #2
Table 'Person'. Scan count 1, logical reads 106
Les résultats de SET STATISTICS IO montre que LIO est le même .Mais les plans d'exécution sont assez différents :
Dans le premier test, SQL Server utilise un Index Scan explicite mais dans le second test SQL Server utilise un Index Seek qui est un Index Seek - range scan . Dans le dernier cas, SQL Server utilise un Compute Scalar opérateur pour générer ces valeurs
[Expr1005] = Scalar Operator(LikeRangeStart([@Pattern])),
[Expr1006] = Scalar Operator(LikeRangeEnd([@Pattern])),
[Expr1007] = Scalar Operator(LikeRangeInfo([@Pattern]))
et, le Index Seek l'opérateur utilise un Seek Predicate (optimisé) pour un range scan (LastName > LikeRangeStart AND LastName < LikeRangeEnd ) plus un autre Predicate non optimisé (LastName LIKE @pattern ).
Ma réponse :ce n'est pas un "vrai" Index Seek . C'est un Index Seek - range scan qui, dans ce cas, a les mêmes performances que Index Scan .
Veuillez également voir la différence entre Index Seek et Index Scan (débat similaire):Alors... est-ce une recherche ou une analyse ?
.
Modification 1 : Le plan d'exécution pour OPTION(RECOMPILE) (voir la recommandation d'Aaron s'il vous plaît) montre également un Index Scan (au lieu de Index Seek ):