Yang mana dari pertanyaan berikut yang lebih cepat (LIKE vs CONTAIN)?
SELECT * FROM table WHERE Column LIKE '%test%';
atau
SELECT * FROM table WHERE Contains(Column, "test");
sql-server
performance
contains
sql-like
pengguna667429
sumber
sumber
Jawaban:
Yang kedua (dengan asumsi Anda berarti
CONTAINS
, dan benar-benar memasukkannya ke dalam kueri yang valid) harus lebih cepat, karena dapat menggunakan beberapa bentuk indeks (dalam hal ini, indeks teks lengkap). Tentu saja, bentuk kueri ini hanya tersedia jika kolom dalam indeks teks lengkap. Jika tidak, maka hanya formulir pertama yang tersedia.Kueri pertama, menggunakan LIKE, tidak akan dapat menggunakan indeks, karena dimulai dengan wildcard, jadi akan selalu memerlukan pemindaian tabel penuh.
The
CONTAINS
permintaan harus:sumber
CONTAINS
? Apa itu? Bentuk asli dari pertanyaan tersebutColumn CONTAIN("%test%",Column)>0
adalah mana yang hampir tidak valid. Itu masih belum sepenuhnya benar.Setelah menjalankan kedua kueri pada contoh SQL Server 2012, saya dapat mengonfirmasi permintaan pertama tercepat dalam kasus saya.
Kueri dengan
LIKE
kata kunci menunjukkan pemindaian indeks berkerumun.The
CONTAINS
juga memiliki indeks scan berkerumun dengan operator tambahan untuk pertandingan teks lengkap dan gabungan bergabung.sumber
LIKE
query dengan wildcard terkemuka tidak akan dapat menggunakan bagian indeks efisien. Ini perlu memindai semuanya. Meskipun tidak diragukan lagi mungkin ada beberapa keadaan di mana pemindaian CI lengkap berkinerja lebih baik daripada permintaan menggunakan indeks teks lengkap (mungkin jika proporsi baris yang sangat tinggi cocok misalnya), ini sebagian besar akan menjadi pengecualian, bukan aturan umum yang Anda "bisa konfirmasi ".LIKE
.Saya pikir itu
CONTAINS
membutuhkan waktu lebih lama dan digunakanMerge
karena Anda memiliki tanda hubung ("-") dalam permintaan Andaadventure-works.com
.Tanda hubung adalah kata istirahat sehingga
CONTAINS
pencarian indeks teks lengkap untukadventure
dan daripada mencariworks.com
dan menggabungkan hasilnya.sumber
Coba juga ubah dari ini:
Untuk ini:
Yang pertama akan menemukan catatan dengan nilai-nilai seperti " ini adalah tes " dan " kasus uji adalah rencananya ".
Yang terakhir juga akan menemukan catatan dengan nilai-nilai seperti " saya menguji ini " dan " ini adalah yang terbesar ".
sumber
CONTAINS
, itu hanya menyebutkan menggunakan istilah awalan seperti 'test *', bukan akhiran istilah seperti ' test' dan bukan pencarian substring penuh seperti '* test '. Saya belum mencobanya.