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");
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");
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 CONTAINSpermintaan harus:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINS? Apa itu? Bentuk asli dari pertanyaan tersebut Column CONTAIN("%test%",Column)>0adalah 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 LIKEkata kunci menunjukkan pemindaian indeks berkerumun.
The CONTAINSjuga memiliki indeks scan berkerumun dengan operator tambahan untuk pertandingan teks lengkap dan gabungan bergabung.

LIKEquery 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 CONTAINSmembutuhkan waktu lebih lama dan digunakan Mergekarena Anda memiliki tanda hubung ("-") dalam permintaan Andaadventure-works.com .
Tanda hubung adalah kata istirahat sehingga CONTAINSpencarian indeks teks lengkap untuk adventuredan daripada mencari works.comdan menggabungkan hasilnya.
Coba juga ubah dari ini:
SELECT * FROM table WHERE Contains(Column, "test") > 0;
Untuk ini:
SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;
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 ".
CONTAINS, itu hanya menyebutkan menggunakan istilah awalan seperti 'test *', bukan akhiran istilah seperti ' test' dan bukan pencarian substring penuh seperti '* test '. Saya belum mencobanya.