Pengujian ini (database AdventureWorks2008R2) menunjukkan apa yang terjadi:
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;
Hasil:
Test #1
Table 'Person'. Scan count 1, logical reads 106
Test #2
Table 'Person'. Scan count 1, logical reads 106
Hasil dari SET STATISTICS IO menunjukkan bahwa LIO sama .Tetapi rencana eksekusi sangat berbeda:
Pada pengujian pertama, SQL Server menggunakan Index Scan eksplisit tetapi dalam pengujian kedua SQL Server menggunakan Index Seek yang merupakan Index Seek - range scan . Dalam kasus terakhir SQL Server menggunakan Compute Scalar operator untuk menghasilkan nilai-nilai ini
[Expr1005] = Scalar Operator(LikeRangeStart([@Pattern])),
[Expr1006] = Scalar Operator(LikeRangeEnd([@Pattern])),
[Expr1007] = Scalar Operator(LikeRangeInfo([@Pattern]))
dan, Index Seek operator menggunakan Seek Predicate (dioptimalkan) untuk range scan (LastName > LikeRangeStart AND LastName < LikeRangeEnd ) ditambah Predicate yang tidak dioptimalkan lainnya (LastName LIKE @pattern ).
Jawaban saya:ini bukan Index Seek "asli" . Ini adalah Index Seek - range scan yang dalam hal ini memiliki performa yang sama seperti Index Scan .
Silakan lihat juga, perbedaan antara Index Seek dan Index Scan (debat serupa):Jadi…apakah ini Pencarian atau Pemindaian?
.
Edit 1 Rencana eksekusi untuk OPTION(RECOMPILE) (lihat rekomendasi Aaron) juga menunjukkan Index Scan (bukan Index Seek ):