Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana cara LIKE '%...' mencari di indeks?

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tambahkan Nomor Baris di Grup

  2. Hasilkan angka acak unik menggunakan SQL

  3. Dapatkan baris sebelumnya dan berikutnya dari baris yang dipilih dengan kondisi (WHERE)

  4. Kunci Eskalasi - Apa yang terjadi di sini?

  5. Mengapa kueri melambat secara drastis jika dalam klausa WHERE konstanta diganti dengan parameter (memiliki nilai yang sama)?