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
):